@@ -544,6 +544,51 @@ DOCUMENTATION-COMPRESSOR-FLAGS."
outputs)
#t)
+
+(define* (patch-dot-desktop-files #:key outputs inputs #:allow-other-keys)
+ "Replace any references to executables in .desktop files with their absolute
+path names."
+ (define (find-binary binary output-dir inputs)
+ "Search for BINARY first in OUTPUT-DIR, then in the directories
+of INPUTS. INPUTS is an alist where the directories are the cdrs. If no
+suitable BINARY cannot be found return BINARY unchanged."
+
+ ;; Search for BINARY in the output directory,
+ ;; then all the input directories.
+ (let lp ((directories (cons output-dir
+ (map (lambda (input)
+ (match input ((_ . y) y))) inputs))))
+ (if (null? directories)
+ ;; Leave unchanged if we cannot find the binary.
+ binary
+ (let ((resolv (find-files
+ (match directories ((x . _) x))
+ (lambda (file stat)
+ ;; The candidate file must be a regular file,
+ ;; have execute permission and the correct name.
+ (and stat
+ (eq? 'regular (stat:type stat))
+ (not (zero? (logand #o001 (stat:perms stat))))
+ (string=? (basename file) binary))))))
+
+ (if (null? resolv)
+ (lp (match directories ((_ . y) y)))
+ (match resolv ((x . _) x)))))))
+
+ (for-each (match-lambda
+ (( _ . output-dir)
+ (for-each (lambda (f)
+ (substitute* f
+ (("^Exec=([^/[:blank:]\r\n]*)(.*)$" _ binary rest)
+ (string-append
+ "Exec=" (find-binary binary output-dir inputs) rest))
+
+ (("^TryExec=([^/[:blank:]\r\n]*)(.*)$" _ binary rest)
+ (string-append
+ "TryExec=" (find-binary binary output-dir inputs) rest))))
+ (find-files output-dir "\\.desktop$"))))
+ outputs) #t)
+
(define %standard-phases
;; Standard build phases, as a list of symbol/procedure pairs.
(let-syntax ((phases (syntax-rules ()
@@ -556,6 +601,7 @@ DOCUMENTATION-COMPRESSOR-FLAGS."
validate-runpath
validate-documentation-location
delete-info-dir-file
+ patch-dot-desktop-files
compress-documentation)))
From: John Darrington <jmd@gnu.org> New patch as requested. * guix/build/gnu-build-system.scm (patch-dot-desktop-files): New procedure. --- guix/build/gnu-build-system.scm | 46 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+)