]> git.donarmstrong.com Git - cran2deb.git/blob - pkg/trunk/R/debcontrol.R
depend: update dependencies to match what's in the Debian repository. force run...
[cran2deb.git] / pkg / trunk / R / debcontrol.R
1 get_dependencies <- function(pkg,extra_deps) {
2     # determine dependencies
3     dependencies <- r_dependencies_of(description=pkg$description)
4     depends <- list()
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
9                                 ,repopref=pkg$repo
10                                 ,build=build))
11     }
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)
22     }
23
24     forced <- forced_deps_as_debian(pkg$name)
25     if (length(forced)) {
26         depends$bin = c(forced$bin,depends$bin)
27         depends$build = c(forced$build,depends$build)
28     }
29
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))
34     }
35     # also include stuff to allow tcltk to build (suggested by Dirk)
36     depends$build = c(depends$build,'xvfb','xauth','xfonts-base')
37
38     # make all bin dependencies build dependencies.
39     depends$build = c(depends$build, depends$bin)
40
41     # remove duplicates
42     depends <- lapply(depends,unique)
43
44     # append the Debian dependencies
45     depends$build=c(depends$build,'debhelper (>> 4.1.0)','cdbs')
46     if (pkg$archdep) {
47         depends$bin=c(depends$bin,'${shlibs:Depends}')
48     }
49
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)
55     return(depends)
56 }
57
58 sysreqs_as_debian <- function(sysreq_text) {
59     # form of this field is unspecified (ugh) but most people seem to stick
60     # with this
61     aliases <- c()
62     sysreq_text <- gsub('[[:space:]]and[[:space:]]',' , ',tolower(sysreq_text))
63     for (sysreq in strsplit(sysreq_text,'[[:space:]]*,[[:space:]]*')[[1]]) {
64         startreq = sysreq
65         # constant case
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)
74         # byebye URLs
75         sysreq = gsub('(ht|f)tps?://[[:alnum:]!?*"\'(),%$_@.&+/=-]*','',sysreq)
76         # squish out space
77         sysreq = chomp(gsub('[[:space:]]+',' ',sysreq))
78         alias <- db_sysreq_override(sysreq)
79         if (is.null(alias)) {
80             error('do not know what to do with SystemRequirement:',sysreq)
81             error('original SystemRequirement:',startreq)
82             fail('unmet system requirement')
83         }
84         notice('mapped SystemRequirement',startreq,'onto',alias,'via',sysreq)
85         aliases = c(aliases,alias)
86     }
87     return(map_aliases_to_debian(aliases))
88 }
89
90 forced_deps_as_debian <- function(r_name) {
91     aliases <- db_get_forced_depends(r_name)
92     return(map_aliases_to_debian(aliases))
93 }
94
95 map_aliases_to_debian <- function(aliases) {
96     if (!length(aliases)) {
97         return(aliases)
98     }
99     debs <- list()
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']
104     return(debs)
105 }
106
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'
116
117     control[2,'Package'] = pkg$debname
118     control[2,'Architecture'] = 'all'
119     if (pkg$archdep) {
120         control[2,'Architecture'] = 'any'
121     }
122     control[2,'Depends'] = paste(pkg$depends$bin,collapse=', ')
123
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)))
131 #                          ,collapse=', ')
132 #    }
133
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='')
138     } else {
139         descr = paste(descr,pkg$name,sep='')
140     }
141     if (pkg$is_bundle) {
142         long_descr <- pkg$description[1,'BundleDescription']
143     } else {
144         long_descr <- pkg$description[1,'Description']
145     }
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='')
152     }
153     control[2,'Description'] = descr
154
155     # Debian policy says 72 char width; indent minimally
156     write.dcf(control,file=pkg$debfile('control.in'),indent=1,width=72)
157 }
158