Ricardo Wurmus <rek...@elephly.net> writes: > * guix/profiles.scm (gtk-im-modules): New procedure. > (%default-profile-hooks): Add it. > --- > guix/profiles.scm | 63 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 63 insertions(+) > > diff --git a/guix/profiles.scm b/guix/profiles.scm > index 78deeb7..1a522ae 100644 > --- a/guix/profiles.scm > +++ b/guix/profiles.scm > @@ -723,6 +723,68 @@ creates the GTK+ 'icon-theme.cache' file for each theme." > #:substitutable? #f) > (return #f)))) > > +(define (gtk-im-modules manifest) > + "Return a derivation that builds the cache files for input method modules > +for both major versions of GTK+." > + > + (mlet %store-monad ((gtk+ (manifest-lookup-package manifest "gtk+" "3")) > + (gtk+-2 (manifest-lookup-package manifest "gtk+" "2"))) > + > + (define (build gtk gtk-version) > + (let ((major (string-take gtk-version 1))) > + (with-imported-modules '((guix build utils) > + (guix build union) > + (guix build profiles) > + (guix search-paths) > + (guix records)) > + #~(begin > + (use-modules (guix build utils) > + (guix build union) > + (guix build profiles) > + (ice-9 popen) > + (srfi srfi-26)) > + > + (let* ((prefix (string-append "/lib/gtk-" #$major ".0/" > + #$gtk-version)) > + (query (string-append #$gtk > "/bin/gtk-query-immodules-" > + #$major ".0")) > + (destdir (string-append #$output prefix)) > + (moddirs (cons (string-append #$gtk prefix "/immodules") > + (filter file-exists? > + (map (cut string-append <> > prefix "/immodules") > + '#$(manifest-inputs > manifest)))))) > + > + ;; Union all the gtk immodules directories. > + (mkdir-p (string-append #$output "/lib/gtk-" #$major ".0")) > + (union-build destdir moddirs #:log-port > (%make-void-port "w"))
I think there is no need to run `union-build'. Other hooks use it because they (eg: update-icon-cache, update-mime-databes) require input and output files in a single directory. > + > + ;; Generate a new 'immodules.cache' file. > + (let ((pipe (apply open-pipe* > + OPEN_READ query > + (map readlink (find-files > destdir "\\.so$")))) and use 'moddirs' here should work.