]> git.donarmstrong.com Git - cran2deb.git/blob - pkg/trunk/exec/build
28db24da85406009e3f08fd5b2d0db8d0023bcc0
[cran2deb.git] / pkg / trunk / exec / build
1 #!/usr/bin/env r
2 suppressMessages(library(cran2deb))
3
4 go <- function(name,extra_deps) {
5     dir <- setup()
6     pkg <- try((function() {
7         pkg <- prepare.new.debian(prepare.pkg(dir,name),extra_deps)
8         # XXX: what about building newer versions?
9         if (pkg$debname %in% debian_pkgs) {
10             message(paste('N:',pkg$srcname,' exists in Debian (perhaps a different version)'))
11             return(pkg)
12         }
13         if (file.exists(changesfile(pkg$srcname,pkg$debversion))) {
14             message(paste('N: already built',pkg$srcname,'version',pkg$debversion))
15             return(pkg)
16         }
17
18         # delete the current archive (XXX: assumes mini-dinstall)
19         for (subdir in c('mini-dinstall','unstable')) {
20             path = file.path(dinstall_archive,subdir)
21             if (file.exists(path)) {
22                 unlink(path,recursive=T)
23             }
24         }
25
26         # delete notes of upload
27         file.remove(Sys.glob(file.path(pbuilder_results,'*.upload')))
28
29         # make mini-dinstall generate the skeleton of the archive
30         ret = system(paste('umask 022;mini-dinstall --batch -c',dinstall_config))
31         if (ret != 0) {
32             stop('failed to create archive')
33         }
34
35         # pull in all the R dependencies
36         message(paste('N: dependencies:',paste(pkg$depends$r,collapse=', ')))
37         for (dep in pkg$depends$r) {
38             message(paste('N: uploading',dep))
39             ret = system(paste('umask 022;dput','-c',shQuote(dput_config),'local'
40                         ,changesfile(dep)))
41             if (ret != 0) {
42                 stop('upload of dependency failed! maybe you did not build it first?')
43             }
44         }
45         build.debian(pkg)
46
47         # upload the package
48         ret = system(paste('umask 022;dput','-c',shQuote(dput_config),'local'
49                     ,changesfile(pkg$srcname,pkg$debversion)))
50         if (ret != 0) {
51             stop('upload failed!')
52         }
53
54         return(pkg)
55     })())
56     cleanup(dir)
57     if (inherits(pkg,'try-error')) {
58         message(paste('E: failure of',name,'means these packages will fail:'
59                      ,paste(r.dependency.closure(name,forward_arcs=F),collapse=', ')))
60         stop(call.=F)
61     }
62     return(pkg)
63 }
64
65 if (exists('argv')) { # check for littler
66     argc <- length(argv)
67     extra_deps = list()
68     extra_deps$deb = c()
69     extra_deps$r = c()
70     opts = c('-D','-R')
71     # first argument is the root --- this is dealt with elsewhere.
72     for (i in 2:argc) {
73         if (!(argv[i] %in% opts)) {
74             if (argc >= i) {
75                 argv <- argv[i:argc]
76             } else {
77                 argv <- list()
78             }
79             argc = argc - i + 1
80             break
81         }
82         if (i == argc) {
83             err('missing argument')
84         }
85         if (argv[i] == '-D') {
86             extra_deps$deb = c(extra_deps$deb,strsplit(chomp(argv[i+1]),',')[[1]])
87         }
88         if (argv[i] == '-R') {
89             extra_deps$r = c(extra_deps$r,strsplit(chomp(argv[i+1]),',')[[1]])
90             extra_deps$deb = c(extra_deps$deb,lapply(extra_deps$r,pkgname.as.debian))
91         }
92     }
93     if (argc == 0) {
94         err('usage: cran2deb [-D extra_dep1,extra_dep2,...] package package ...')
95     }
96     build_order <- r.dependency.closure(c(extra_deps$r,argv))
97     message(paste('N: build order',paste(build_order,collapse=', ')))
98     for (pkg in build_order) {
99         go(pkg,extra_deps)
100     }
101 }