diff options
author | Ludovic Courtès <ludo@gnu.org> | 2019-10-03 22:54:28 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2019-10-03 23:48:59 +0200 |
commit | cdf9811d24b9c857cb79e0ddd38181862ec34bd3 (patch) | |
tree | 3556b66d4c31aee4c7ede7b3992488c53b273641 | |
parent | 5a02f8e3842c19d28f39e5b47d804ef70e1b3160 (diff) |
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.
-rw-r--r-- | guix/gexp.scm | 49 |
1 files changed, 31 insertions, 18 deletions
diff --git a/guix/gexp.scm b/guix/gexp.scm index e788fc5981..26881ce16c 100644 --- a/guix/gexp.scm +++ b/guix/gexp.scm @@ -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)) |