From e1f42b7b3b83040ec9a6916a31118d0e9844fdf1 Mon Sep 17 00:00:00 2001 From: blundellc Date: Sat, 13 Sep 2008 13:18:34 +0000 Subject: [PATCH] sysreq: parse SystemRequirements and check each one against database, after preprocessing. ``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 | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/pkg/trunk/R/debcontrol.R b/pkg/trunk/R/debcontrol.R index 1639369..cdbc4fb 100644 --- a/pkg/trunk/R/debcontrol.R +++ b/pkg/trunk/R/debcontrol.R @@ -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() -- 2.39.5