Subject: [bug#36477] [PATCH v3 48/48] wip: tools.

From: Mathieu Othacehe <[email-masked]>
Date: Mon, 2 Sep 2019 17:33:33 +0200

---
 build-sorted-ok-ko-packages.sh          | 354 ++++++++++++++++++++++++
 deps.scm                                | 184 ++++++++++++
 gnu/system/examples/mini-beaglebone.scm |  61 ++++
 gnu/system/examples/mini.scm            |  54 ++++
 4 files changed, 653 insertions(+)
 create mode 100755 build-sorted-ok-ko-packages.sh
 create mode 100644 deps.scm
 create mode 100644 gnu/system/examples/mini-beaglebone.scm
 create mode 100644 gnu/system/examples/mini.scm

diff --git a/build-sorted-ok-ko-packages.sh b/build-sorted-ok-ko-packages.sh
new file mode 100755
index 0000000000..a2a13dcdfc
--- /dev/null
+++ b/build-sorted-ok-ko-packages.sh
@@ -0,0 +1,354 @@
+#!/bin/bash -
+
+set -o nounset                              # Treat unset variables as an error
+
+mngt_dir()
+{
+    local dirname=$1
+
+    rm -rf ${dirname}.bk
+    if [ -e $dirname ]; then
+        mv $dirname ${dirname}.bk
+    fi
+    mkdir ${dirname}
+}
+
+DEPENDENCIES_DIR="packages-dependencies"
+KO_OUT_LOG_DIR="ko-out-log-dir"
+OUT_FILE_NAME_BASE="packages-status"
+OUT_FILE_NAME_EXT="wiki"
+OUT_FILE_NAME=${OUT_FILE_NAME_BASE}.${OUT_FILE_NAME_EXT}
+
+rm -f ${OUT_FILE_NAME}.bk
+if [ -e $OUT_FILE_NAME ]; then
+    mv $OUT_FILE_NAME ${OUT_FILE_NAME}.bk
+fi
+
+mngt_dir ${DEPENDENCIES_DIR}
+mngt_dir ${KO_OUT_LOG_DIR}
+
+NB_OK=0
+NB_KO=0
+NB_UNKNOWN=0
+
+file_header()
+{
+    local title="Packages status"
+
+    echo ""
+    echo "start file $OUT_FILE_NAME"
+    echo ""
+
+    echo "" >> $OUT_FILE_NAME
+    echo "= $title =" >> $OUT_FILE_NAME
+    echo "" >> $OUT_FILE_NAME
+}
+
+section_header()
+{
+    local title=$1
+
+    echo ""
+    echo ""
+    echo "start section \"$title\""
+
+    echo "" >> $OUT_FILE_NAME
+    echo "== $title ==" >> $OUT_FILE_NAME
+    echo "" >> $OUT_FILE_NAME
+    echo "| package | status | nb dependencies |" >> $OUT_FILE_NAME
+
+    NB_OK=0
+    NB_KO=0
+    NB_UNKNOWN=0
+}
+
+section_footer()
+{
+    echo "" >> $OUT_FILE_NAME
+    echo "nb packages OK in section: $NB_OK" >> $OUT_FILE_NAME
+    echo "" >> $OUT_FILE_NAME
+    echo "nb packages *KO* in section: $NB_KO" >> $OUT_FILE_NAME
+    echo "" >> $OUT_FILE_NAME
+    echo "nb packages UNKNOWN in section: $NB_UNKNOWN" >> $OUT_FILE_NAME
+    echo "" >> $OUT_FILE_NAME
+    echo "" >> $OUT_FILE_NAME
+}
+
+add_package_status()
+{
+    local package=$1
+    local status=$2
+    local nb_deps=$3
+
+    if [ "$status" = "OK" ]; then
+        NB_OK=$(($NB_OK+1))
+    elif [ "$status" = "KO" ]; then
+        status="*KO*"
+        NB_KO=$(($NB_KO+1))
+    else
+        NB_UNKNOWN=$(($NB_UNKNOWN+1))
+    fi
+
+    echo "| $package | $status | $nb_deps |" >> $OUT_FILE_NAME
+}
+
+LIST_PACK_SUPPOSED_OK=""
+
+LIST_PACK_SUPPOSED_OK+=" xz"
+LIST_PACK_SUPPOSED_OK+=" tk"
+LIST_PACK_SUPPOSED_OK+=" m4"
+LIST_PACK_SUPPOSED_OK+=" ed"
+LIST_PACK_SUPPOSED_OK+=" bc"
+LIST_PACK_SUPPOSED_OK+=" tcl"
+LIST_PACK_SUPPOSED_OK+=" sed"
+LIST_PACK_SUPPOSED_OK+=" mpc"
+LIST_PACK_SUPPOSED_OK+=" lzo"
+LIST_PACK_SUPPOSED_OK+=" isl"
+LIST_PACK_SUPPOSED_OK+=" gss"
+LIST_PACK_SUPPOSED_OK+=" gmp"
+LIST_PACK_SUPPOSED_OK+=" bdb"
+LIST_PACK_SUPPOSED_OK+=" acl"
+LIST_PACK_SUPPOSED_OK+=" zlib"
+LIST_PACK_SUPPOSED_OK+=" sudo"
+LIST_PACK_SUPPOSED_OK+=" perl"
+LIST_PACK_SUPPOSED_OK+=" pcre"
+LIST_PACK_SUPPOSED_OK+=" mpfr"
+LIST_PACK_SUPPOSED_OK+=" make"
+LIST_PACK_SUPPOSED_OK+=" lzip"
+LIST_PACK_SUPPOSED_OK+=" gzip"
+LIST_PACK_SUPPOSED_OK+=" grep"
+LIST_PACK_SUPPOSED_OK+=" gdbm"
+LIST_PACK_SUPPOSED_OK+=" gawk"
+LIST_PACK_SUPPOSED_OK+=" fuse"
+LIST_PACK_SUPPOSED_OK+=" flex"
+LIST_PACK_SUPPOSED_OK+=" flac"
+LIST_PACK_SUPPOSED_OK+=" file"
+LIST_PACK_SUPPOSED_OK+=" fftw"
+LIST_PACK_SUPPOSED_OK+=" bash"
+LIST_PACK_SUPPOSED_OK+=" attr"
+LIST_PACK_SUPPOSED_OK+=" which"
+LIST_PACK_SUPPOSED_OK+=" unzip"
+LIST_PACK_SUPPOSED_OK+=" rhash"
+LIST_PACK_SUPPOSED_OK+=" libuv"
+LIST_PACK_SUPPOSED_OK+=" libgc"
+LIST_PACK_SUPPOSED_OK+=" libev"
+LIST_PACK_SUPPOSED_OK+=" guile"
+LIST_PACK_SUPPOSED_OK+=" groff"
+LIST_PACK_SUPPOSED_OK+=" gperf"
+LIST_PACK_SUPPOSED_OK+=" glibc"
+LIST_PACK_SUPPOSED_OK+=" expat"
+LIST_PACK_SUPPOSED_OK+=" bzip2"
+LIST_PACK_SUPPOSED_OK+=" bison"
+LIST_PACK_SUPPOSED_OK+=" xtrans"
+LIST_PACK_SUPPOSED_OK+=" tzdata"
+LIST_PACK_SUPPOSED_OK+=" sqlite"
+LIST_PACK_SUPPOSED_OK+=" shishi"
+LIST_PACK_SUPPOSED_OK+=" shadow"
+LIST_PACK_SUPPOSED_OK+=" python"
+LIST_PACK_SUPPOSED_OK+=" nettle"
+LIST_PACK_SUPPOSED_OK+=" libxft"
+LIST_PACK_SUPPOSED_OK+=" libxcb"
+LIST_PACK_SUPPOSED_OK+=" libxau"
+LIST_PACK_SUPPOSED_OK+=" libx11"
+LIST_PACK_SUPPOSED_OK+=" libpng"
+LIST_PACK_SUPPOSED_OK+=" libogg"
+LIST_PACK_SUPPOSED_OK+=" libidn"
+LIST_PACK_SUPPOSED_OK+=" libffi"
+LIST_PACK_SUPPOSED_OK+=" libelf"
+LIST_PACK_SUPPOSED_OK+=" libcap"
+LIST_PACK_SUPPOSED_OK+=" libbsd"
+LIST_PACK_SUPPOSED_OK+=" indent"
+LIST_PACK_SUPPOSED_OK+=" gnutls"
+LIST_PACK_SUPPOSED_OK+=" c-ares"
+LIST_PACK_SUPPOSED_OK+=" texinfo"
+LIST_PACK_SUPPOSED_OK+=" python2"
+LIST_PACK_SUPPOSED_OK+=" psutils"
+LIST_PACK_SUPPOSED_OK+=" ncurses"
+LIST_PACK_SUPPOSED_OK+=" libxslt"
+LIST_PACK_SUPPOSED_OK+=" libxml2"
+LIST_PACK_SUPPOSED_OK+=" libxext"
+LIST_PACK_SUPPOSED_OK+=" libtool"
+LIST_PACK_SUPPOSED_OK+=" libtiff"
+LIST_PACK_SUPPOSED_OK+=" libssh2"
+LIST_PACK_SUPPOSED_OK+=" libltdl"
+LIST_PACK_SUPPOSED_OK+=" libjpeg"
+LIST_PACK_SUPPOSED_OK+=" libidn2"
+LIST_PACK_SUPPOSED_OK+=" jansson"
+LIST_PACK_SUPPOSED_OK+=" shepherd"
+LIST_PACK_SUPPOSED_OK+=" net-base"
+LIST_PACK_SUPPOSED_OK+=" libxdmcp"
+LIST_PACK_SUPPOSED_OK+=" libtasn1"
+LIST_PACK_SUPPOSED_OK+=" libpaper"
+LIST_PACK_SUPPOSED_OK+=" jemalloc"
+LIST_PACK_SUPPOSED_OK+=" jbig2dec"
+LIST_PACK_SUPPOSED_OK+=" gs-fonts"
+LIST_PACK_SUPPOSED_OK+=" freetype"
+LIST_PACK_SUPPOSED_OK+=" elfutils"
+LIST_PACK_SUPPOSED_OK+=" binutils"
+LIST_PACK_SUPPOSED_OK+=" automake"
+LIST_PACK_SUPPOSED_OK+=" autoconf"
+LIST_PACK_SUPPOSED_OK+=" alsa-lib"
+LIST_PACK_SUPPOSED_OK+=" xorgproto"
+LIST_PACK_SUPPOSED_OK+=" xcb-proto"
+LIST_PACK_SUPPOSED_OK+=" linux-pam"
+LIST_PACK_SUPPOSED_OK+=" libvorbis"
+LIST_PACK_SUPPOSED_OK+=" libgcrypt"
+LIST_PACK_SUPPOSED_OK+=" inetutils"
+LIST_PACK_SUPPOSED_OK+=" findutils"
+LIST_PACK_SUPPOSED_OK+=" e2fsprogs"
+LIST_PACK_SUPPOSED_OK+=" diffutils"
+LIST_PACK_SUPPOSED_OK+=" coreutils"
+LIST_PACK_SUPPOSED_OK+=" util-linux"
+LIST_PACK_SUPPOSED_OK+=" libxrender"
+LIST_PACK_SUPPOSED_OK+=" libsndfile"
+LIST_PACK_SUPPOSED_OK+=" libsigsegv"
+LIST_PACK_SUPPOSED_OK+=" libfontenc"
+LIST_PACK_SUPPOSED_OK+=" guile-json"
+LIST_PACK_SUPPOSED_OK+=" fontconfig"
+LIST_PACK_SUPPOSED_OK+=" util-macros"
+LIST_PACK_SUPPOSED_OK+=" mkfontscale"
+LIST_PACK_SUPPOSED_OK+=" linux-libre"
+LIST_PACK_SUPPOSED_OK+=" ghostscript"
+LIST_PACK_SUPPOSED_OK+=" docbook-xsl"
+LIST_PACK_SUPPOSED_OK+=" docbook-xml"
+LIST_PACK_SUPPOSED_OK+=" bash-static"
+LIST_PACK_SUPPOSED_OK+=" libunistring"
+LIST_PACK_SUPPOSED_OK+=" libgpg-error"
+LIST_PACK_SUPPOSED_OK+=" bash-minimal"
+LIST_PACK_SUPPOSED_OK+=" libsamplerate"
+LIST_PACK_SUPPOSED_OK+=" libatomic-ops"
+LIST_PACK_SUPPOSED_OK+=" e2fsck-static"
+LIST_PACK_SUPPOSED_OK+=" wireless-regdb"
+LIST_PACK_SUPPOSED_OK+=" python-wrapper"
+LIST_PACK_SUPPOSED_OK+=" python-minimal"
+LIST_PACK_SUPPOSED_OK+=" guile-readline"
+LIST_PACK_SUPPOSED_OK+=" guile-gdbm-ffi"
+LIST_PACK_SUPPOSED_OK+=" gettext-minimal"
+LIST_PACK_SUPPOSED_OK+=" libpthread-stubs"
+LIST_PACK_SUPPOSED_OK+=" openfwwf-firmware"
+LIST_PACK_SUPPOSED_OK+=" glibc-utf8-locales"
+LIST_PACK_SUPPOSED_OK+=" ath9k-htc-firmware"
+LIST_PACK_SUPPOSED_OK+=" linux-libre-headers"
+LIST_PACK_SUPPOSED_OK+=" guile-static-stripped"
+LIST_PACK_SUPPOSED_OK+=" python-minimal-wrapper"
+LIST_PACK_SUPPOSED_OK+=" pkg-config"
+LIST_PACK_SUPPOSED_OK+=" libarchive"
+LIST_PACK_SUPPOSED_OK+=" cyrus-sasl"
+LIST_PACK_SUPPOSED_OK+=" tcsh"
+LIST_PACK_SUPPOSED_OK+=" xmlto"
+LIST_PACK_SUPPOSED_OK+=" icu4c" # ?
+LIST_PACK_SUPPOSED_OK+=" mit-krb5" # ok ?
+LIST_PACK_SUPPOSED_OK+=" help2man"
+LIST_PACK_SUPPOSED_OK+=" mkfontdir"
+LIST_PACK_SUPPOSED_OK+=" lvm2"
+LIST_PACK_SUPPOSED_OK+=" eudev"
+LIST_PACK_SUPPOSED_OK+=" procps"
+LIST_PACK_SUPPOSED_OK+=" alsa-utils"
+LIST_PACK_SUPPOSED_OK+=" boost"
+LIST_PACK_SUPPOSED_OK+=" swig"
+LIST_PACK_SUPPOSED_OK+=" doxygen"
+LIST_PACK_SUPPOSED_OK+=" curl"
+LIST_PACK_SUPPOSED_OK+=" nghttp2"
+LIST_PACK_SUPPOSED_OK+=" openldap"
+LIST_PACK_SUPPOSED_OK+=" git-minimal"
+
+
+LIST_PACK_SUPPOSED_KO=""
+
+LIST_PACK_SUPPOSED_KO+=" libnl"
+LIST_PACK_SUPPOSED_KO+=" crda" # depends on libnl
+LIST_PACK_SUPPOSED_KO+=" cmake"
+LIST_PACK_SUPPOSED_KO+=" guile-wm"
+LIST_PACK_SUPPOSED_KO+=" guile-xcb"
+
+count_dependencies()
+{
+    local pack="$1"
+    local depsfile="$DEPENDENCIES_DIR/${pack}.dot"
+    guix graph -t bag-emerged $pack > $depsfile
+    count=$(cat $depsfile | grep "\->" | wc -l)
+    echo $count
+}
+
+build_pack()
+{
+    local pack="$1"
+    local out_file=$(mktemp /tmp/test-guix.XXXXX)
+    local result=0
+
+    ./pre-inst-env guix build --target=aarch64-linux-gnu $pack > $out_file 2>&1
+    result=$?
+
+    if [ $result -eq 0 ]; then
+        rm -f $out_file
+    else
+        mv $out_file ${KO_OUT_LOG_DIR}/${pack}.log
+    fi
+
+    return $result
+}
+
+build_all_in_list()
+{
+    local list_pack="$@"
+    local status=unknown
+
+    for pack in $list_pack; do
+        echo ""
+        echo ""
+        echo "--------------- package $pack ---------------"
+        echo ""
+        build_pack $pack
+        if [ $? -eq 0 ]; then
+            status="OK"
+        else
+            status="KO"
+        fi
+
+        nb_deps="$(count_dependencies $pack)"
+        echo "  package $pack is $status (and has $nb_deps dependencies)"
+        echo ""
+        echo ""
+
+        add_package_status $pack $status $nb_deps
+    done
+}
+
+if [ $# -ge 1 ]; then
+    EXEC_SUPPOSED_OK=0
+    EXEC_SUPPOSED_KO=0
+    while [ $# -ge 1 ]; do
+        case "$1" in
+            "--ok")
+                EXEC_SUPPOSED_OK=1
+                ;;
+            "--ko")
+                EXEC_SUPPOSED_KO=1
+                ;;
+            *)
+                echo "Unknown argument $1"
+                exit 1
+                ;;
+        esac
+        shift
+    done
+else
+    EXEC_SUPPOSED_OK=1
+    EXEC_SUPPOSED_KO=1
+fi
+
+file_header
+
+if [ $EXEC_SUPPOSED_OK -eq 1 ]; then
+    section_header "Supposed OK Packages"
+    build_all_in_list $LIST_PACK_SUPPOSED_OK
+    section_footer
+fi
+
+if [ $EXEC_SUPPOSED_KO -eq 1 ]; then
+    section_header "Supposed KO Packages"
+    build_all_in_list $LIST_PACK_SUPPOSED_KO
+    section_footer
+fi
+
+
diff --git a/deps.scm b/deps.scm
new file mode 100644
index 0000000000..75e8f106fe
--- /dev/null
+++ b/deps.scm
@@ -0,0 +1,184 @@
+(use-modules (guix)
+             (guix scripts build)
+             (gnu)
+             (ice-9 receive))
+
+(define deps
+  '("sudo"
+    "guile-xcb"
+    "guile-wm"
+    "tzdata"
+    "guile-gdbm-ffi"
+    "gzip"
+    "expat"
+    "attr"
+    "gettext-minimal"
+    "m4"
+    "perl"
+    "gmp"
+    "acl"
+    "libcap"
+    "libsigsegv"
+    "pkg-config"
+    "zlib"
+    "libffi"
+    "glibc"
+    "bash-static"
+    "bison"
+    "texinfo"
+    "lzip"
+    "ed"
+    "libatomic-ops"
+    "libltdl"
+    "libunistring"
+    "libgc"
+    "linux-libre-headers"
+    "bzip2"
+    "bash-minimal"
+    "diffutils"
+    "binutils"
+    "findutils"
+    "guile"
+    "sed"
+    "make"
+    "gawk"
+    "xz"
+    "grep"
+    "file"
+    "coreutils"
+    "glibc-utf8-locales"
+    "libpng"
+    "freetype"
+    "libfontenc"
+    "mkfontdir"
+    "mkfontscale"
+    "guile-readline"
+    "lzo"
+    "rhash"
+    "libuv"
+    "libarchive"
+    "cmake"
+    "ath9k-htc-firmware"
+    "openfwwf-firmware"
+    "inetutils"
+    "tcsh"
+    "pcre"
+    "boost"
+    "swig"
+    "libnl"
+    "wireless-regdb"
+    "flac"
+    "libsndfile"
+    "libvorbis"
+    "libogg"
+    "xmlto"
+    "fftw"
+    "alsa-lib"
+    "alsa-utils"
+    "libsamplerate"
+    "lvm2"
+    "fuse"
+    "crda"
+    "which"
+    "help2man"
+    "indent"
+    "flex"
+    "gdbm"
+    "mit-krb5"
+    "openldap"
+    "cyrus-sasl"
+    "curl"
+    "icu4c"
+    "bdb"
+    "libev"
+    "jemalloc"
+    "jansson"
+    "c-ares"
+    "linux-pam"
+    "shishi"
+    "xtrans"
+    "libbsd"
+    "python-minimal-wrapper"
+    "xcb-proto"
+    "python-minimal"
+    "gs-fonts"
+    "fontconfig"
+    "libxrender"
+    "libxft"
+    "tk"
+    "xorgproto"
+    "libpthread-stubs"
+    "util-macros"
+    "libxau"
+    "libxext"
+    "libxcb"
+    "sqlite"
+    "libxdmcp"
+    "libx11"
+    "libpaper"
+    "jbig2dec"
+    "tcl"
+    "libjpeg"
+    "libtiff"
+    "psutils"
+    "ghostscript"
+    "groff"
+    "libgpg-error"
+    "libtasn1"
+    "libssh2"
+    "python2"
+    "gss"
+    "libgcrypt"
+    "nettle"
+    "libidn"
+    "nghttp2"
+    "libidn2"
+    "git-minimal"
+    "gnutls"
+    "guile-json"
+    "unzip"
+    "autoconf"
+    "automake"
+    "docbook-xml"
+    "libtool"
+    "python"
+    "python-wrapper"
+    "libxslt"
+    "libxml2"
+    "docbook-xsl"
+    "gperf"
+    "eudev"
+    "shadow"
+    "bash"
+    "shepherd"
+    "isl"
+    "net-base"
+    "procps"
+    "util-linux"
+    "e2fsprogs"
+    "e2fsck-static"
+    "guile-static-stripped"
+    "libelf"
+    "ncurses"
+    "mpc"
+    "bc"
+    "elfutils"
+    "mpfr"
+    "linux-libre"))
+
+(define store (open-connection))
+
+(define arguments
+  (map (lambda (spec)
+         `(argument . ,spec))
+       deps))
+
+(run-with-store store
+  (mlet %store-monad
+      ((derivations ->
+        ((@@ (guix scripts build) options->derivations)
+         store
+         `((target . "aarch64-linux-gnu")
+           ,@arguments))))
+    (mbegin %store-monad
+      (built-derivations derivations))))
diff --git a/gnu/system/examples/mini-beaglebone.scm b/gnu/system/examples/mini-beaglebone.scm
new file mode 100644
index 0000000000..6ce0ab1b1c
--- /dev/null
+++ b/gnu/system/examples/mini-beaglebone.scm
@@ -0,0 +1,61 @@
+;; This is an operating system configuration template
+;; for a "bare bones" setup, with no X11 display server.
+
+(use-modules (gnu) (gnu bootloader u-boot))
+(use-service-modules networking ssh)
+(use-package-modules bootloaders linux screen)
+
+(operating-system
+  (host-name "komputilo")
+  (timezone "Europe/Berlin")
+  (locale "en_US.utf8")
+
+  ;; Boot in "legacy" BIOS mode, assuming /dev/sdX is the
+  ;; target hard disk, and "my-root" is the label of the target
+  ;; root file system.
+  (bootloader (bootloader-configuration
+               (bootloader u-boot-beaglebone-black-bootloader)
+               (target "/dev/vda")))
+
+  (kernel linux-libre-arm-omap2plus)
+
+  ;; This module is required to mount the SD card.
+  (initrd-modules (cons "omap_hsmmc" %base-initrd-modules))
+
+  (file-systems (cons (file-system
+                        (device (file-system-label "my-root"))
+                        (mount-point "/")
+                        (type "ext4"))
+                      %base-file-systems))
+
+  ;; This is where user accounts are specified.  The "root"
+  ;; account is implicit, and is initially created with the
+  ;; empty password.
+  (users (cons (user-account
+                (name "alice")
+                (comment "Bob's sister")
+                (group "users")
+
+                ;; Adding the account to the "wheel" group
+                ;; makes it a sudoer.  Adding it to "audio"
+                ;; and "video" allows the user to play sound
+                ;; and access the webcam.
+                (supplementary-groups '("wheel"
+                                        "audio" "video")))
+               %base-user-accounts))
+
+  ;; Globally-installed packages.
+  (packages '())
+
+  ;; Add services to the baseline: a DHCP client and
+  ;; an SSH server.
+  (services (list
+             (service udev-service-type
+                      (udev-configuration
+                       (rules (list lvm2 fuse alsa-utils crda))))
+             (agetty-service
+              (agetty-configuration
+               (extra-options '("-L"))
+               (baud-rate "115200")
+               (term "vt100")
+               (tty "ttyO0"))))))
diff --git a/gnu/system/examples/mini.scm b/gnu/system/examples/mini.scm
new file mode 100644
index 0000000000..f7c7b63308
--- /dev/null
+++ b/gnu/system/examples/mini.scm
@@ -0,0 +1,54 @@
+;; This is an operating system configuration template
+;; for a "bare bones" setup, with no X11 display server.
+
+(use-modules (gnu))
+(use-service-modules networking ssh)
+(use-package-modules linux screen)
+
+(define dummy-bootloader
+  (bootloader
+   (inherit grub-bootloader)
+   (installer #f)))
+
+(operating-system
+  (host-name "komputilo")
+  (timezone "Europe/Berlin")
+  (locale "en_US.utf8")
+
+  ;; Boot in "legacy" BIOS mode, assuming /dev/sdX is the
+  ;; target hard disk, and "my-root" is the label of the target
+  ;; root file system.
+  (bootloader (bootloader-configuration
+                (bootloader dummy-bootloader)
+                (target "/dev/sdX")))
+  (file-systems (cons (file-system
+                        (device (file-system-label "my-root"))
+                        (mount-point "/")
+                        (type "ext4"))
+                      %base-file-systems))
+
+  ;; This is where user accounts are specified.  The "root"
+  ;; account is implicit, and is initially created with the
+  ;; empty password.
+  (users (cons (user-account
+                (name "alice")
+                (comment "Bob's sister")
+                (group "users")
+
+                ;; Adding the account to the "wheel" group
+                ;; makes it a sudoer.  Adding it to "audio"
+                ;; and "video" allows the user to play sound
+                ;; and access the webcam.
+                (supplementary-groups '("wheel"
+                                        "audio" "video")))
+               %base-user-accounts))
+
+  ;; Globally-installed packages.
+  (packages '())
+
+  ;; Add services to the baseline: a DHCP client and
+  ;; an SSH server.
+  (services (list
+             (service udev-service-type
+                      (udev-configuration
+                       (rules (list lvm2 fuse alsa-utils crda)))))))
-- 
2.20.1