From 32575294eef1b1cfc6564dc7217e42c740c08cda Mon Sep 17 00:00:00 2001 From: Rutherther Date: Tue, 25 Mar 2025 15:36:53 +0100 Subject: [PATCH] profiles: gtk-icon-themes: Produce only 'icon-theme.cache' files. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously the profile will produce a new symlink for each icon file, now it will reuse existed ones if possible. * guix/profiles.scm (gtk-icon-themes): Only install 'icon-theme.cache' files into the output. Adjust produce docstring. Fixes: https://issues.guix.gnu.org/77487 Change-Id: Ia452565768753b8a60baf4fc075f6fe5ebb4fa39 Signed-off-by: 宋文武 --- guix/profiles.scm | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/guix/profiles.scm b/guix/profiles.scm index fb4dbc5bd079cd95353d5f065ef848bbcefd4873..64d669c35306b89977f182fb5987b16f9e813edb 100644 --- a/guix/profiles.scm +++ b/guix/profiles.scm @@ -1352,8 +1352,8 @@ creates the Glib 'gschemas.compiled' file." (return #f)))) (define* (gtk-icon-themes manifest #:optional system) - "Return a derivation that unions all icon themes from manifest entries and -creates the GTK+ 'icon-theme.cache' file for each theme." + "Return a derivation that builds the @file{icon-theme.cache} file for each +icon theme. It's used by GTK applications to speedup icons loading." (define gtk+ ; lazy reference (module-ref (resolve-interface '(gnu packages gtk)) 'gtk+)) @@ -1382,23 +1382,29 @@ creates the GTK+ 'icon-theme.cache' file for each theme." (let* ((destdir (string-append #$output "/share/icons")) (icondirs (filter file-exists? (map (cut string-append <> "/share/icons") - '#$(manifest-inputs manifest))))) - + '#$(manifest-inputs manifest)))) + (cache-file-name "icon-theme.cache") + (scratchdir (string-append (getcwd) "/icons"))) ;; Union all the icons. - (mkdir-p (string-append #$output "/share")) - (union-build destdir icondirs + (union-build scratchdir icondirs #:log-port (%make-void-port "w")) ;; Update the 'icon-theme.cache' file for each icon theme. (for-each (lambda (theme) - (let ((dir (string-append destdir "/" theme))) - ;; Occasionally DESTDIR contains plain files, such as + (let* ((dir (string-append scratchdir "/" theme)) + (cache-file (string-append dir "/" cache-file-name))) + ;; Occasionally SCRATCHDIR contains plain files, such as ;; "abiword_48.png". Ignore these. (when (file-is-directory? dir) (ensure-writable-directory dir) - (system* #+gtk-update-icon-cache "-t" dir "--quiet")))) - (scandir destdir (negate (cut member <> '("." ".."))))))))) + (system* #+gtk-update-icon-cache "-t" dir "--quiet") + (when (file-exists? cache-file) + (mkdir-p (string-append destdir "/" theme)) + (copy-file + cache-file + (string-append destdir "/" theme "/" cache-file-name)))))) + (scandir scratchdir (negate (cut member <> '("." ".."))))))))) ;; Don't run the hook when there's nothing to do. (if %gtk+