(begin
  (use-modules (srfi srfi-19))
  `((title . "GNOME in GuixSD")
    (author . "Ludovic Courtès")
    (date unquote (make-date 0 0 0 0 23 3 2016 3600))
    (tags unquote (list "Desktop environments" "Software development"))
    (content
      div
      (p "It’s a feature that many users were waiting for: proper "
         (a (@ (href "https://www.gnome.org/")) "GNOME")
         " support in GuixSD.  Good news: the forthcoming Guix and GuixSD release will give you exactly that!  Don’t miss the obligatory "
         (a (@ (href "/static/blog/img/gnome-totem-epiphany.png"))
            "screenshot")
         "!"
         (br))
      (p "You would think adding GNOME is routine distro work involving a lot of packaging and bits of plumbing that’s already been done a hundred times, which is probably true!  Yet, adding GNOME support turned out to be interesting in many ways: it’s a good test for GuixSD’s declarative operating system configuration framework, it’s a way to formalize how this whole software stack fits together, and it’s been an insightful journey into GNU/Linux desktop plumbing!"
         (br))
      (p "Of course, a lot of software needs to be packaged to begin with.  This had been on-going for some time, culminating with the addition of a "
         (a (@ (href "https://www.gnu.org/software/guix/packages/#gnome"))
            "gnome meta-package")
         " thanks to the hard work of 宋文武 (Sou Bunnbu) and other hackers.  On the way, we added "
         (a (@ (href "https://lists.gnu.org/archive/html/guix-devel/2015-12/msg00173.html"))
            "an auto-updater for GNOME packages")
         ", because all these package recipes need love."
         (br))
      (p "The more interesting parts were system integration.  Modern GNOME/Freedesktop environments rely on a number of daemons, most of which talk over "
         (a (@ (href "https://www.freedesktop.org/wiki/Software/dbus/"))
            "D-Bus")
         ", and extending each other’s functionality: udev, udisks, upower, colord, geoclue, and polkit, to name a few.  Being able to "
         (em "compose")
         " all these system services was one of the driving use cases behind "
         (a (@ (href "/news/service-composition-in-guixsd.html"))
            "the design of GuixSD’s new service composition framework")
         ".  With this design, we knew we were able to have fine control over the "
         (a (@ (href "https://www.gnu.org/software/guix/manual/en/html_node/Service-Composition.html"))
            "service composition graph")
         ".  Challenge #1 overcome!"
         (br))
      (p "Since GuixSD uses the "
         (a (@ (href "https://www.gnu.org/software/shepherd/"))
            "GNU Shepherd")
         " and not systemd as its init system, we needed a way to provide the "
         (a (@ (href "https://freedesktop.org/wiki/Software/systemd/logind/"))
            "“logind”")
         " functionality that systemd implements, and which allows GNOME to know about "
         (a (@ (href "https://www.freedesktop.org/wiki/Software/systemd/multiseat/"))
            "users, sessions, and seats")
         "."
         (br))
      (p "So Andy Wingo courageously started by "
         (a (@ (href "https://lists.gnu.org/archive/html/guix-devel/2015-04/msg00352.html"))
            "extracting")
         " logind from systemd, leading to "
         (a (@ (href "https://github.com/wingo/elogind"))
            "“elogind”")
         ".  At this point, we had this daemon that could keep track of logged-in users and active sessions, and which GNOME could talk to over D-Bus… provided all the relevant "
         (a (@ (href "http://www.linux-pam.org/"))
            "PAM services")
         " would use the pam_elogind module so that elogind knows when a user logs in and out, as Andy "
         (a (@ (href "https://lists.gnu.org/archive/html/guix-devel/2015-08/msg00439.html"))
            "nicely explained it")
         "."
         (br))
      (p "This pam_elogind thing is a typical example of a cross-cutting concern: "
         (em "if")
         " you use elogind, "
         (em "then")
         " you want all the relevant login-related PAM services (mingetty, the X login manager, commands such as su, the SSH daemon, etc.) to use pam_elogind.  To achieve that, we "
         (a (@ (href "http://git.savannah.gnu.org/cgit/guix.git/commit/?id=12c00bca92e3eef2b86565924bbefc39397b5497"))
            "updated")
         " our PAM service such that it could be "
         (a (@ (href "https://lists.gnu.org/archive/html/guix-devel/2016-02/msg00163.html"))
            "extended")
         " with such "
         (a (@ (href "http://git.savannah.gnu.org/cgit/guix.git/commit/?id=e7ad0d586251383a4c8b00222e8dec61d491f03b"))
            "cross-cutting modules")
         ".  At last, we had proper logind support! "
         (br))
      (p "At this point, the brave could start using GNOME on GuixSD but would soon realize that, for example, the “power off” button wouldn’t have the desired effect, or that changing a laptop’s backlight wouldn’t work because "
         (a (@ (href "https://www.freedesktop.org/wiki/Software/polkit/"))
            "polkit")
         ", the daemon that allows unprivileged users to perform privileged operations like that one, was "
         (a (@ (href "https://lists.gnu.org/archive/html/guix-devel/2016-02/msg01000.html"))
            "missing essential policy files")
         "."
         (br))
      (p "You would think you can finally change the brightness of your screen, but no!  Turns out that polkit would "
         (a (@ (href "https://lists.gnu.org/archive/html/guix-devel/2016-02/msg01170.html"))
            "refuse to run gnome-setting-daemon’s backlight helper program")
         " because "
         (a (@ (href "https://lists.gnu.org/archive/html/guix-devel/2016-03/msg00247.html"))
            "elogind happened to fail to map PIDs to sessions")
         ".  Whatever."
         (br))
      (p "Of course there were still a bunch of embarrassing glitches such as "
         (a (@ (href "http://debbugs.gnu.org/cgi/bugreport.cgi?bug=22666"))
            "GNOME suspending right after it wakes up from suspend")
         ", failure to start in QEMU, or "
         (a (@ (href "https://lists.gnu.org/archive/html/guix-devel/2016-03/msg00690.html"))
            "the lack of GNOME’s favorite font")
         ".  Well, it seems that all these are gone now!"
         (br))
      (p "GuixSD users can now enable GNOME by adding "
         (a (@ (href "https://lists.gnu.org/archive/html/guix-devel/2016-03/msg00639.html"))
            "one line")
         " in their "
         (a (@ (href "https://www.gnu.org/software/guix/manual/en/html_node/Using-the-Configuration-System.html"))
            "operating system configuration")
         ".  Overall, this has been a nice experience involving a variety of areas."
         (br))
      (h4 "About GNU Guix")
      (p (a (@ (href "http://www.gnu.org/software/guix"))
            "GNU Guix")
         " is a functional package manager for the GNU system.  The Guix System Distribution or GuixSD is an advanced distribution of the GNU system that relies on GNU Guix and "
         (a (@ (href "http://www.gnu.org/distros/free-system-distribution-guidelines.html"))
            "respects the user's freedom")
         "."
         (br))
      (p "In addition to standard package management features, Guix supports transactional upgrades and roll-backs, unprivileged package management, per-user profiles, and garbage collection.  Guix uses low-level mechanisms from the Nix package manager, except that packages are defined as native "
         (a (@ (href "http://www.gnu.org/software/guile"))
            "Guile")
         " modules, using extensions to the "
         (a (@ (href "http://schemers.org")) "Scheme")
         " language.  GuixSD offers a declarative approach to operating system configuration management, and is highly customizable and hackable."
         (br))
      (p "GuixSD can be used on an i686 or x86_64 machine.  It is also possible to use Guix on top of an already installed GNU/Linux system, including on mips64el and armv7."
         (br)))))
