Federico Beffa <be...@ieee.org> writes: > I added support for GIO and theming data according to the XDG specifications. > > https://developer.gnome.org/gio/stable/running-gio-apps.html > http://www.freedesktop.org/wiki/Specifications/ > > Regards, > Fede > From c726b525111ff2f8055f7f2be98b7a5e61a8a96e Mon Sep 17 00:00:00 2001 > From: Federico Beffa <be...@fbengineering.ch> > Date: Thu, 18 Dec 2014 20:58:18 +0100 > Subject: [PATCH 1/4] guix: build/glib-or-gtk-build-system: Add support for GIO > and XDG theming. > > * guix/build/glib-or-gtk-build-system.scm (data-directories): Rename > 'schemas-directories' to 'data-directories' and add support for XDG theming > data. > > * guix/build/glib-or-gtk-build-system.scm (gio-module-directories): New > function. > > * guix/build/glib-or-gtk-build-system.scm (wrap-all-programs): Update names to > reflect that we are dealing with more types of data and not only with > schemas. Add handling of GIO modules. > > * guix/build-system/glib-or-gtk.scm (lower): Import the 'bin' output of GLib > instead of 'out'. This was an error since we need the program > 'glib-compile-schemas'. Update the description. > --- > guix/build-system/glib-or-gtk.scm | 11 ++-- > guix/build/glib-or-gtk-build-system.scm | 99 > ++++++++++++++++++++++++++------- > 2 files changed, 84 insertions(+), 26 deletions(-) > > diff --git a/guix/build-system/glib-or-gtk.scm > b/guix/build-system/glib-or-gtk.scm > index 8091311..ff95ca5 100644 > --- a/guix/build-system/glib-or-gtk.scm > +++ b/guix/build-system/glib-or-gtk.scm > @@ -38,11 +38,10 @@ > ;; > ;; 'glib-or-gtk-wrap' phase: > ;; > -;; a) This phase looks for GSettings schemas by verifying the existence of > -;; path "datadir/glib-2.0/schemas" in all input packages. If the path is > -;; found in any package, then all programs in "out/bin" are wrapped in > scripts > -;; where the environment variable "XDG_DATA_DIRS" is set and points to the > -;; list of found schemas directories. > +;; a) This phase looks for GSettings schemas, GIO modules and theming data. > +;; If any of these is found in any input package, then all programs in > +;; "out/bin" are wrapped in scripts defining the nedessary environment > +;; variables. > ;; > ;; b) Looks for the existence of "libdir/gtk-3.0" directories in all input > ;; packages. If any is found, then the environment variable "GTK_PATH" is > @@ -95,7 +94,7 @@ > `(("source" ,source)) > '()) > ,@inputs)) > - (build-inputs `(("glib:bin" ,glib) > + (build-inputs `(("glib:bin" ,glib "bin") > ,@(if implicit-inputs? > (standard-packages) > '()) > diff --git a/guix/build/glib-or-gtk-build-system.scm > b/guix/build/glib-or-gtk-build-system.scm > index 9351a70..712087e 100644 > --- a/guix/build/glib-or-gtk-build-system.scm > +++ b/guix/build/glib-or-gtk-build-system.scm > @@ -41,6 +41,9 @@ > (fold (lambda (s p) (or (string-ci=? s directory) p)) > #f directories-list)) > > +;; We do not include $HOME/.guix-profile/gtk-v.0 (v=2 or 3) because we do not > +;; want to mix gtk+-2 and gtk+-3 modules. See > +;; https://developer.gnome.org/gtk3/stable/gtk-running.html > (define (gtk-module-directories inputs) > "Check for the existence of \"libdir/gtk-v.0\" in INPUTS. Return a list > with all found directories." > @@ -64,20 +67,68 @@ with all found directories." > prev))))) > (fold gtk-module '() inputs))) > > -(define (schemas-directories inputs) > - "Check for the existence of \"datadir/glib-2.0/schemas\" in INPUTS. Return > -a list with all found directories." > - (define (glib-schemas input previous) > +;; We include $HOME/.guix-profile/share so that if the user installs a > +;; desktop, a sound or an icon theme, the application should be able to see > +;; it, without having to add the theme to the application inputs. See > +;; http://www.freedesktop.org/wiki/DesktopThemeSpec > +;; http://freedesktop.org/wiki/Specifications/sound-theme-spec > +;; http://freedesktop.org/wiki/Specifications/icon-theme-spec FYI, every apps will install icons into 'hicolor-icon-theme', for it to work, we need regenerated the 'icon-theme.cache' by `gtk-update-icon-cache`. > +;; > +;; Currently desktop themes are not well supported and do not honor > +;; XDG_DATA_DIRS. One example is evince which only looks for desktop themes > +;; in $HOME/.themes (for backward compatibility) and in XDG_DATA_HOME (which > +;; defaults to $HOME/.local/share). One way to handle these applications > +;; appears to be by making $HOME/.themes a symlink to > +;; $HOME/.guix-profile/share/themes. > +;; > +;; Note however that GLib's schemas added in $HOME/.guix-profile/share by the > +;; installation of a library or application will not necessarily work. This > +;; is because GLib only looks for compiled schemas (in a file called > +;; gschemas.compiled) and currently $HOME/.guix-profile/share does not > include > +;; such a file comprising all XML schemas visible in that directory. > +(define (data-directories inputs) > + "Check for the existence of \"$datadir/glib-2.0/schemas\" or XDG themes > data > +in INPUTS. Return a list with all found directories." > + (define (data-directory input previous) > (let* ((in (match input > ((_ . dir) dir) > (_ ""))) > (datadir (string-append in "/share"))) > - (if (and (subdirectory-exists? datadir "/glib-2.0/schemas") > + (if (and (or (subdirectory-exists? datadir "/glib-2.0/schemas") > + (subdirectory-exists? datadir "/sounds") > + (subdirectory-exists? datadir "/themes") > + (subdirectory-exists? datadir "/cursors") > + (subdirectory-exists? datadir "/wallpapers") > + (subdirectory-exists? datadir "/icons")) > > (not (directory-included? datadir previous))) > (cons datadir previous) > previous))) > > - (fold glib-schemas '() inputs)) > + (fold data-directory '("$HOME/.guix-profile/share") inputs)) > + > +;; All GIO modules are expected to be installed in GLib's $libdir/gio/modules > +;; directory. That directory has to include a file called giomodule.cache > +;; listing all available modules. GIO can be made aware of modules in other > +;; directories with the help of the environment variable GIO_EXTRA_MODULES. > +;; The official GIO documentation states that this environment variable > should > +;; only be used for testing and not in a production environment. However, it > +;; appears that there is no other way of specifying multiple modules > +;; directories (NIXOS also does use this variable). See > +;; https://developer.gnome.org/gio/stable/running-gio-apps.html > +(define (gio-module-directories inputs) > + "Check for the existence of \"$libdir/gio/modules\" in the INPUTS and > +returns a list with all found directories." > + (define (gio-module-directory input previous) > + (let* ((in (match input > + ((_ . dir) dir) > + (_ ""))) > + (gio-mod-dir (string-append in "/lib/gio/modules"))) > + (if (and (directory-exists? gio-mod-dir) > + (not (directory-included? gio-mod-dir previous))) > + (cons gio-mod-dir previous) > + previous))) > + > + (fold gio-module-directory '("$HOME/.guix-profile/gio/modules") > inputs)) We should avoid hardcoding guix-profile or current-system to packages. IMO, for those kind of things, a better place would be '/etc/profile'.
And, apps will crash when user has incompatible gio modules, See: https://github.com/NixOS/nixpkgs/issues/1357 > > (define* (wrap-all-programs #:key inputs outputs > (glib-or-gtk-wrap-excluded-outputs '()) > @@ -96,28 +147,36 @@ add a dependency of that output on GLib and GTK+." > (unless (member output glib-or-gtk-wrap-excluded-outputs) > (let* ((bindir (string-append directory "/bin")) > (bin-list (find-files bindir ".*")) > - (schemas (schemas-directories > + (datadirs (data-directories > (alist-cons output directory inputs))) > (gtk-mod-dirs (gtk-module-directories > (alist-cons output directory inputs))) > - (schemas-env-var > - (if (not (null? schemas)) > - `("XDG_DATA_DIRS" ":" prefix ,schemas) > + (gio-mod-dirs (gio-module-directories > + (alist-cons output directory inputs))) > + (data-env-var > + (if (not (null? datadirs)) > + `("XDG_DATA_DIRS" ":" prefix ,datadirs) > #f)) > (gtk-mod-env-var > (if (not (null? gtk-mod-dirs)) > `("GTK_PATH" ":" prefix ,gtk-mod-dirs) > + #f)) > + (gio-mod-env-var > + (if (not (null? gio-mod-dirs)) > + `("GIO_EXTRA_MODULES" ":" prefix ,gio-mod-dirs) > #f))) > - (cond > - ((and schemas-env-var gtk-mod-env-var) > - (for-each (cut wrap-program <> schemas-env-var gtk-mod-env-var) > - bin-list)) > - (schemas-env-var > - (for-each (cut wrap-program <> schemas-env-var) > - bin-list)) > - (gtk-mod-env-var > - (for-each (cut wrap-program <> gtk-mod-env-var) > - bin-list)))))))) > + ;; Since datadirs and gio-mod-dirs are the result of fold with an > + ;; initial value, data-env-var and gio-mod-env-var can't be #f > + (if gtk-mod-env-var > + (for-each (cut wrap-program <> > + data-env-var > + gtk-mod-env-var > + gio-mod-env-var) > + bin-list) > + (for-each (cut wrap-program <> > + data-env-var > + gio-mod-env-var) > + bin-list))))))) > > (for-each handle-output outputs) > #t) > -- > 1.8.4