[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 1/4] guix: build/glib-or-gtk-build-system: Add support for GI
From: |
宋文武 |
Subject: |
Re: [PATCH 1/4] guix: build/glib-or-gtk-build-system: Add support for GIO and XDG theming. |
Date: |
Fri, 19 Dec 2014 20:56:27 +0800 |
User-agent: |
Notmuch/0.18.1 (http://notmuchmail.org) Emacs/24.4.1 (x86_64-unknown-linux-gnu) |
Federico Beffa <address@hidden> 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 <address@hidden>
> 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