1 get_dependencies <- function(pkg,extra_deps) {
2 # determine dependencies
3 dependencies <- r_dependencies_of(description=pkg$description)
5 # these are used for generating the Depends fields
6 as_deb <- function(r,build) {
7 return(pkgname_as_debian(paste(dependencies[r,]$name)
8 ,version=dependencies[r,]$version
12 depends$bin <- lapply(rownames(dependencies), as_deb, build=F)
13 depends$build <- lapply(rownames(dependencies), as_deb, build=T)
14 # add the command line dependencies
15 depends$bin = c(extra_deps$deb,depends$bin)
16 depends$build = c(extra_deps$deb,depends$build)
17 # add the system requirements
18 if ('SystemRequirements' %in% colnames(pkg$description)) {
19 sysreq <- sysreqs_as_debian(pkg$description[1,'SystemRequirements'])
20 depends$bin = c(sysreq$bin,depends$bin)
21 depends$build = c(sysreq$build,depends$build)
24 forced <- forced_deps_as_debian(pkg$name)
26 depends$bin = c(forced$bin,depends$bin)
27 depends$build = c(forced$build,depends$build)
30 # make sure we depend upon R in some way...
31 if (!length(grep('^r-base',depends$build))) {
32 depends$build = c(depends$build,pkgname_as_debian('R',version='>= 2.7.0',build=T))
33 depends$bin = c(depends$bin, pkgname_as_debian('R',version='>= 2.7.0',build=F))
35 # also include stuff to allow tcltk to build (suggested by Dirk)
36 depends$build = c(depends$build,'xvfb','xauth','xfonts-base')
38 # make all bin dependencies build dependencies.
39 depends$build = c(depends$build, depends$bin)
42 depends <- lapply(depends,unique)
44 # append the Debian dependencies
45 depends$build=c(depends$build,'debhelper (>> 4.1.0)','cdbs')
47 depends$bin=c(depends$bin,'${shlibs:Depends}')
50 # the names of dependent source packages (to find the .changes file to
51 # upload via dput). these can be found recursively.
52 depends$r = r_dependency_closure(dependencies)
53 # append command line dependencies
54 depends$r = c(extra_deps$r, depends$r)
58 sysreqs_as_debian <- function(sysreq_text) {
59 # form of this field is unspecified (ugh) but most people seem to stick
62 sysreq_text <- gsub('[[:space:]]and[[:space:]]',' , ',tolower(sysreq_text))
63 for (sysreq in strsplit(sysreq_text,'[[:space:]]*,[[:space:]]*')[[1]]) {
66 sysreq = tolower(sysreq)
67 # drop version information/comments for now
68 sysreq = gsub('[[][^])]*[]]','',sysreq)
69 sysreq = gsub('\\([^)]*\\)','',sysreq)
70 sysreq = gsub('[[][^])]*[]]','',sysreq)
71 sysreq = gsub('version','',sysreq)
72 sysreq = gsub('from','',sysreq)
73 sysreq = gsub('[<>=]*[[:space:]]*[[:digit:]]+[[:digit:].+:~-]*','',sysreq)
75 sysreq = gsub('(ht|f)tps?://[[:alnum:]!?*"\'(),%$_@.&+/=-]*','',sysreq)
77 sysreq = chomp(gsub('[[:space:]]+',' ',sysreq))
78 alias <- db_sysreq_override(sysreq)
80 error('do not know what to do with SystemRequirement:',sysreq)
81 error('original SystemRequirement:',startreq)
82 fail('unmet system requirement')
84 notice('mapped SystemRequirement',startreq,'onto',alias,'via',sysreq)
85 aliases = c(aliases,alias)
87 return(map_aliases_to_debian(aliases))
90 forced_deps_as_debian <- function(r_name) {
91 aliases <- db_get_forced_depends(r_name)
92 return(map_aliases_to_debian(aliases))
95 map_aliases_to_debian <- function(aliases) {
96 if (!length(aliases)) {
100 debs$bin = unlist(sapply(aliases, db_get_depends))
101 debs$build = unlist(sapply(aliases, db_get_depends, build=T))
102 debs$bin = debs$bin[debs$bin != 'build-essential']
103 debs$build = debs$build[debs$build != 'build-essential']
107 generate_control <- function(pkg) {
108 # construct control file
109 control = data.frame()
110 control[1,'Source'] = pkg$srcname
111 control[1,'Section'] = 'math'
112 control[1,'Priority'] = 'optional'
113 control[1,'Maintainer'] = maintainer
114 control[1,'Build-Depends'] = paste(pkg$depends$build,collapse=', ')
115 control[1,'Standards-Version'] = '3.8.0'
117 control[2,'Package'] = pkg$debname
118 control[2,'Architecture'] = 'all'
120 control[2,'Architecture'] = 'any'
122 control[2,'Depends'] = paste(pkg$depends$bin,collapse=', ')
124 # # bundles provide virtual packages of their contents
125 # # unnecessary for now; cran2deb converts R bundles itself
126 # if (pkg$is_bundle) {
127 # control[2,'Provides'] = paste(
128 # lapply(r_bundle_contains(pkg$name)
129 # ,function(name) return(pkgname_as_debian(paste(name)
130 # ,repopref=pkg$repo)))
134 # generate the description
135 descr = 'GNU R package "'
136 if ('Title' %in% colnames(pkg$description)) {
137 descr = paste(descr,pkg$description[1,'Title'],sep='')
139 descr = paste(descr,pkg$name,sep='')
142 long_descr <- pkg$description[1,'BundleDescription']
144 long_descr <- pkg$description[1,'Description']
146 # using \n\n.\n\n is not very nice, but is necessary to make sure
147 # the longer description does not begin on the synopsis line --- R's
148 # write.dcf does not appear to have a nicer way of doing this.
149 descr = paste(descr,'"\n\n', long_descr, sep='')
150 if ('URL' %in% colnames(pkg$description)) {
151 descr = paste(descr,'\n\nURL: ',pkg$description[1,'URL'],sep='')
153 control[2,'Description'] = descr
155 # Debian policy says 72 char width; indent minimally
156 write.dcf(control,file=pkg$debfile('control.in'),indent=1,width=72)