gexp: 'load-path-expression' produces an expression that deletes duplicates.

Fixes <https://bugs.gnu.org/37531>.

"herd eval root '(length %load-path)'" on a freshly-booted bare-bones
system now returns 8 instead of 119 before.

* guix/gexp.scm (load-path-expression): Rewrite expression to that it
deletes duplicates.
This commit is contained in:
Ludovic Courtès 2019-10-03 22:54:28 +02:00
parent 5a02f8e384
commit cdf9811d24
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5

View File

@ -1527,24 +1527,37 @@ are searched for in PATH. Return #f when MODULES and EXTENSIONS are empty."
#:module-path path
#:system system
#:target target)))
(return (gexp (eval-when (expand load eval)
(set! %load-path
(cons (ungexp modules)
(append (map (lambda (extension)
(string-append extension
"/share/guile/site/"
(effective-version)))
'((ungexp-native-splicing extensions)))
%load-path)))
(set! %load-compiled-path
(cons (ungexp compiled)
(append (map (lambda (extension)
(string-append extension
"/lib/guile/"
(effective-version)
"/site-ccache"))
'((ungexp-native-splicing extensions)))
%load-compiled-path)))))))))
(return
(gexp (eval-when (expand load eval)
;; Augment the load paths and delete duplicates. Do that
;; without loading (srfi srfi-1) or anything.
(let ((extensions '((ungexp-native-splicing extensions)))
(prepend (lambda (items lst)
;; This is O(N²) but N is typically small.
(let loop ((items items)
(lst lst))
(if (null? items)
lst
(loop (cdr items)
(cons (car items)
(delete (car items) lst))))))))
(set! %load-path
(prepend (cons (ungexp modules)
(map (lambda (extension)
(string-append extension
"/share/guile/site/"
(effective-version)))
extensions))
%load-path))
(set! %load-compiled-path
(prepend (cons (ungexp compiled)
(map (lambda (extension)
(string-append extension
"/lib/guile/"
(effective-version)
"/site-ccache"))
extensions))
%load-compiled-path)))))))))
(define* (gexp->script name exp
#:key (guile (default-guile))