import/cran: Add generic way to detect needed libraries.

* guix/import/cran.scm (needed-libraries-in-directory): New procedure.
(libraries-pattern, packages-for-matches): New variables.
This commit is contained in:
Ricardo Wurmus 2023-02-17 22:25:27 +01:00
parent 271c0bfcf2
commit 049cff91ac
No known key found for this signature in database
GPG key ID: 197A5888235FACAC

View file

@ -55,6 +55,7 @@ (define-module (guix import cran)
#:use-module (guix ui)
#:use-module (guix upstream)
#:use-module (guix packages)
#:use-module (guix sets)
#:use-module (gnu packages)
#:export (%input-style
@ -475,6 +476,50 @@ (define (directory-needs-zlib? dir)
zlib linker flag."
(files-match-pattern? dir "-lz" "(Makevars.*|configure.*)"))
(define packages-for-matches
'(("-lcrypto" . "openssl")
("-lcurl" . "curl")
("-lgit2" . "libgit2")
("-lpcre" . "pcre2")
("-lssh" . "openssh")
("-lssl" . "openssl")
("-ltbb" . "tbb")
("-lz" . "zlib")
("gsl-config" . "gsl")
("xml2-config" . "libxml2")
("CURL_LIBS" . "curl")))
(define libraries-pattern
(make-regexp
(string-append "("
(string-join
(map (compose regexp-quote first) packages-for-matches) "|")
")")))
(define (needed-libraries-in-directory dir)
"Return a list of package names that correspond to libraries that are
referenced in build system files."
(set->list
(fold
(lambda (file packages)
(call-with-input-file file
(lambda (port)
(let loop ((packages packages))
(let ((line (read-line port)))
(cond
((eof-object? line) packages)
(else
(loop
(fold (lambda (match acc)
(or (and=> (assoc-ref packages-for-matches
(match:substring match))
(cut set-insert <> acc))
acc))
packages
(list-matches libraries-pattern line))))))))))
(set)
(find-files dir "(Makevars.in*|configure.*)"))))
(define (directory-needs-pkg-config? dir)
"Return #T if any of the Makevars files in the src directory DIR reference
the pkg-config tool."