build-support/gnu: Add support for file patterns in search paths.

* guix/build/utils.scm (search-path-as-list): Add #:pattern parameter
  and honor it.
  (set-path-environment-variable): Likewise, and pass it to
  'search-path-as-list'.
* guix/packages.scm (search-path-specification->sexp): Add PATTERN slot.
* guix/build/gnu-build-system.scm (set-paths): Adjust accordingly.
This commit is contained in:
Ludovic Courtès 2014-12-27 22:55:34 +01:00
parent af07095516
commit 7ec02d374d
3 changed files with 40 additions and 13 deletions

View File

@ -73,21 +73,23 @@
input-directories))) input-directories)))
(for-each (match-lambda (for-each (match-lambda
((env-var (files ...) separator type) ((env-var (files ...) separator type pattern)
(set-path-environment-variable env-var files (set-path-environment-variable env-var files
input-directories input-directories
#:separator separator #:separator separator
#:type type))) #:type type
#:pattern pattern)))
search-paths) search-paths)
(when native-search-paths (when native-search-paths
;; Search paths for native inputs, when cross building. ;; Search paths for native inputs, when cross building.
(for-each (match-lambda (for-each (match-lambda
((env-var (files ...) separator type) ((env-var (files ...) separator type pattern)
(set-path-environment-variable env-var files (set-path-environment-variable env-var files
native-input-directories native-input-directories
#:separator separator #:separator separator
#:type type))) #:type type
#:pattern pattern)))
native-search-paths)) native-search-paths))
#t) #t)

View File

@ -291,7 +291,7 @@ matches REGEXP."
;;; ;;;
(define* (search-path-as-list files input-dirs (define* (search-path-as-list files input-dirs
#:key (type 'directory)) #:key (type 'directory) pattern)
"Return the list of directories among FILES of the given TYPE (a symbol as "Return the list of directories among FILES of the given TYPE (a symbol as
returned by 'stat:type') that exist in INPUT-DIRS. Example: returned by 'stat:type') that exist in INPUT-DIRS. Example:
@ -300,13 +300,26 @@ returned by 'stat:type') that exist in INPUT-DIRS. Example:
=> (\"/package1/share/emacs/site-lisp\" => (\"/package1/share/emacs/site-lisp\"
\"/package3/share/emacs/site-lisp\") \"/package3/share/emacs/site-lisp\")
When PATTERN is true, it is a regular expression denoting file names to look
for under the directories designated by FILES. For example:
(search-path-as-list '(\"xml\") (list docbook-xml docbook-xsl)
#:type 'regular
#:pattern \"^catalog\\\\.xml$\")
=> (\"/…/xml/dtd/docbook/catalog.xml\"
\"/…/xml/xsl/docbook-xsl-1.78.1/catalog.xml\")
" "
(append-map (lambda (input) (append-map (lambda (input)
(filter-map (lambda (file) (append-map (lambda (file)
(let* ((file (string-append input "/" file)) (let ((file (string-append input "/" file)))
(stat (stat file #f))) ;; XXX: By using 'find-files', we implicitly
(and stat (eq? type (stat:type stat)) ;; assume #:type 'regular.
file))) (if pattern
(find-files file pattern)
(let ((stat (stat file #f)))
(if (and stat (eq? type (stat:type stat)))
(list file)
'())))))
files)) files))
input-dirs)) input-dirs))
@ -319,7 +332,8 @@ returned by 'stat:type') that exist in INPUT-DIRS. Example:
(define* (set-path-environment-variable env-var files input-dirs (define* (set-path-environment-variable env-var files input-dirs
#:key #:key
(separator ":") (separator ":")
(type 'directory)) (type 'directory)
pattern)
"Look for each of FILES of the given TYPE (a symbol as returned by "Look for each of FILES of the given TYPE (a symbol as returned by
'stat:type') in INPUT-DIRS. Set ENV-VAR to a SEPARATOR-separated path 'stat:type') in INPUT-DIRS. Set ENV-VAR to a SEPARATOR-separated path
accordingly. Example: accordingly. Example:
@ -327,9 +341,19 @@ accordingly. Example:
(set-path-environment-variable \"PKG_CONFIG\" (set-path-environment-variable \"PKG_CONFIG\"
'(\"lib/pkgconfig\") '(\"lib/pkgconfig\")
(list package1 package2)) (list package1 package2))
When PATTERN is not #f, it must be a regular expression (really a string)
denoting file names to look for under the directories designated by FILES:
(set-path-environment-variable \"XML_CATALOG_FILES\"
'(\"xml\")
(list docbook-xml docbook-xsl)
#:type 'regular
#:pattern \"^catalog\\\\.xml$\")
" "
(let* ((path (search-path-as-list files input-dirs (let* ((path (search-path-as-list files input-dirs
#:type type)) #:type type
#:pattern pattern))
(value (list->search-path-as-string path separator))) (value (list->search-path-as-string path separator)))
(if (string-null? value) (if (string-null? value)
(begin (begin

View File

@ -181,7 +181,8 @@ representation."
corresponds to the arguments expected by `set-path-environment-variable'." corresponds to the arguments expected by `set-path-environment-variable'."
(match spec (match spec
(($ <search-path-specification> variable files separator type) (($ <search-path-specification> variable files separator type)
`(,variable ,files ,separator ,type)))) ;; TODO: Add support for PATTERN.
`(,variable ,files ,separator ,type #f))))
(define %supported-systems (define %supported-systems
;; This is the list of system types that are supported. By default, we ;; This is the list of system types that are supported. By default, we