summary refs log tree commit diff
path: root/gnu/packages.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/packages.scm')
-rw-r--r--gnu/packages.scm35
1 files changed, 27 insertions, 8 deletions
diff --git a/gnu/packages.scm b/gnu/packages.scm
index 9df3b975d5..ddabacd199 100644
--- a/gnu/packages.scm
+++ b/gnu/packages.scm
@@ -35,6 +35,7 @@
             search-bootstrap-binary
             %patch-directory
             %bootstrap-binaries-path
+            %package-module-path
 
             fold-packages
 
@@ -86,6 +87,12 @@
   ;; Absolute file name of the module hierarchy.
   (dirname (search-path %load-path "guix.scm")))
 
+(define %package-module-path
+  ;; Search path for package modules.  Each item must be either a directory
+  ;; name or a pair whose car is a directory and whose cdr is a sub-directory
+  ;; to narrow the search.
+  (list (cons %distro-root-directory "gnu/packages")))
+
 (define* (scheme-files directory)
   "Return the list of Scheme files found under DIRECTORY."
   (file-system-fold (const #t)                    ; enter?
@@ -106,13 +113,12 @@
                     directory
                     stat))
 
-(define (file-name->module-name file)
-  "Return the module name (a list of symbols) corresponding to FILE."
-  (define not-slash
-    (char-set-complement (char-set #\/)))
-
-  (map string->symbol
-       (string-tokenize (string-drop-right file 4) not-slash)))
+(define file-name->module-name
+  (let ((not-slash (char-set-complement (char-set #\/))))
+    (lambda (file)
+      "Return the module name (a list of symbols) corresponding to FILE."
+      (map string->symbol
+           (string-tokenize (string-drop-right file 4) not-slash)))))
 
 (define* (package-modules directory #:optional sub-directory)
   "Return the list of modules that provide packages for the distribution.
@@ -128,6 +134,19 @@ Optionally, narrow the search to SUB-DIRECTORY."
                                 (string-append directory "/" sub-directory)
                                 directory))))
 
+(define* (all-package-modules #:optional (path (%package-module-path)))
+  "Return the list of package modules found in PATH, a list of directories to
+search."
+  (fold-right (lambda (spec result)
+                (match spec
+                  ((? string? directory)
+                   (append (package-modules directory) result))
+                  ((directory . sub-directory)
+                   (append (package-modules directory sub-directory)
+                           result))))
+              '()
+              path))
+
 (define (fold-packages proc init)
   "Call (PROC PACKAGE RESULT) for each available package, using INIT as
 the initial value of RESULT.  It is guaranteed to never traverse the
@@ -147,7 +166,7 @@ same package twice."
                                module)))
           init
           vlist-null
-          (package-modules %distro-root-directory "gnu/packages"))))
+          (all-package-modules))))
 
 (define* (find-packages-by-name name #:optional version)
   "Return the list of packages with the given NAME.  If VERSION is not #f,