]> git.donarmstrong.com Git - cran2deb.git/commitdiff
sysreq: parse SystemRequirements and check each one against database, after preproces...
authorblundellc <blundellc@edb9625f-4e0d-4859-8d74-9fd3b1da38cb>
Sat, 13 Sep 2008 13:18:34 +0000 (13:18 +0000)
committerblundellc <blundellc@edb9625f-4e0d-4859-8d74-9fd3b1da38cb>
Sat, 13 Sep 2008 13:18:34 +0000 (13:18 +0000)
``Writing R extensions'' does not actually specify a format for
SystemRequirements.  Fortunately most package authors seem to use
a similar notation as that of Depends/Imports, but also include URLs
and ad-hoc information.

This is enough to make the R package Matrix depend correctly on 'make'
and likely more after a bit of leg work.

git-svn-id: svn://svn.r-forge.r-project.org/svnroot/cran2deb@60 edb9625f-4e0d-4859-8d74-9fd3b1da38cb

pkg/trunk/R/debcontrol.R

index 1639369c84b6a0f009763f75fc038fe5161158cc..cdbc4fb323c28bdef7400117ecf0e376695ce6fb 100644 (file)
@@ -1,8 +1,4 @@
 get.dependencies <- function(pkg,extra_deps) {
-    if ('SystemRequirements' %in% colnames(pkg$description)) {
-        stop(paste('Unsupported SystemRequirements:',pkg$description[1,'SystemRequirements']))
-    }
-
     # determine dependencies
     dependencies <- r.dependencies.of(description=pkg$description)
     depends <- list()
@@ -18,6 +14,12 @@ get.dependencies <- function(pkg,extra_deps) {
     # add the command line dependencies
     depends$bin = c(extra_deps$deb,depends$bin)
     depends$build = c(extra_deps$deb,depends$build)
+    # add the system requirements
+    if ('SystemRequirements' %in% colnames(pkg$description)) {
+        sysreq <- sysreqs.as.debian(pkg$description[1,'SystemRequirements'])
+        depends$bin = c(sysreq,depends$bin)
+        depends$build = c(sysreq,depends$build)
+    }
 
     # make sure we depend upon R in some way...
     if (!length(grep('^r-base',depends$build))) {
@@ -45,6 +47,34 @@ get.dependencies <- function(pkg,extra_deps) {
     return(depends)
 }
 
+sysreqs.as.debian <- function(sysreq_text) {
+    # form of this field is unspecified (ugh) but most people seem to stick
+    # with this
+    debs <- c()
+    for (sysreq in strsplit(sysreq_text,'[[:space:]]*,[[:space:]]*')[[1]]) {
+        startreq = sysreq
+        # constant case
+        sysreq = tolower(sysreq)
+        # drop version information/comments for now
+        sysreq = gsub('[\\([][^])]*[]\\)]','',sysreq)
+        sysreq = gsub('version','',sysreq)
+        sysreq = gsub('[<>=]*[[:space:]]*[[:digit:]]+[[:digit:].+:~-]*','',sysreq)
+        # byebye URLs
+        sysreq = gsub('(ht|f)tps?://[[:alnum:]!?*"\'(),%$_@.&+/=-]*','',sysreq)
+        # squish out space
+        sysreq = chomp(gsub('[[:space:]]+',' ',sysreq))
+        deb <- db.sysreq.override(sysreq)
+        if (is.na(deb)) {
+            message(paste('E: do not know what to do with SystemRequirement:',sysreq))
+            message(paste('E: original SystemRequirement:',startreq))
+            stop('unmet system requirement')
+        }
+        message(paste('N: mapped SystemRequirement',startreq,'onto',deb,'via',sysreq))
+        debs = c(debs,deb)
+    }
+    return(debs)
+}
+
 generate.control <- function(pkg) {
     # construct control file
     control = data.frame()