1- # -*- tab-width: 4; -*-
2-
3- # Copyright (C) 2009 - 2015 Dirk Eddelbuettel and Romain Francois
1+ # Copyright (C) 2009 - 2016 Dirk Eddelbuettel and Romain Francois
42#
53# This file is part of Rcpp.
64#
@@ -30,74 +28,77 @@ Rcpp.package.skeleton <- function(name = "anRpackage", list = character(),
3028
3129havePkgKitten <- requireNamespace(" pkgKitten" ,quietly = TRUE )
3230
31+
3332call <- match.call()
3433call [[1 ]]<- as.name(" package.skeleton" )
3534env <- parent.frame(1 )
3635
37- if (! is.character(cpp_files ))
38- stop(" 'cpp_files' must be a character vector" )
36+ if (! is.character(cpp_files ))
37+ stop(" 'cpp_files' must be a character vector" )
3938
40- if (! length(list )) {
41- fake <- TRUE
42- assign(" Rcpp.fake.fun" ,function () {},envir = env )
43- if (example_code && ! isTRUE(attributes )) {
44- assign(" rcpp_hello_world" ,function () {},envir = env )
45- remove_hello_world <- TRUE
46- }else {
39+ if (! length(list )) {
40+ fake <- TRUE
41+ assign(" Rcpp.fake.fun" ,function () {},envir = env )
42+ if (example_code && ! isTRUE(attributes )) {
43+ assign(" rcpp_hello_world" ,function () {},envir = env )
44+ remove_hello_world <- TRUE
45+ }else {
4746remove_hello_world <- FALSE
48- }
49- }else {
47+ }
48+ }else {
5049if (example_code && ! isTRUE(attributes )) {
5150if (! " rcpp_hello_world" %in% list ) {
5251 assign(" rcpp_hello_world" ,function () {},envir = env )
5352call [[" list" ]]<- as.call(c(as.name(" c" ),
5453 as.list(c(" rcpp_hello_world" ,list ))))
5554 }
56- remove_hello_world <- TRUE
57- }else {
58- remove_hello_world <- FALSE
59- }
60- fake <- FALSE
61- }
55+ remove_hello_world <- TRUE
56+ }else {
57+ remove_hello_world <- FALSE
58+ }
59+ fake <- FALSE
60+ }
6261
6362# # first let the traditional version do its business
64- # # remove Rcpp specific arguments
63+ # # remove Rcpp specific arguments
6564
66- call <- call [ c(1L , which(names(call )%in% names(formals(package.skeleton )))) ]
65+ call <- call [ c(1L , which(names(call )%in% names(formals(package.skeleton )))) ]
6766
68- if (fake ) {
69- call [[" list" ]]<- c(if (isTRUE(example_code )
67+ if (fake ) {
68+ call [[" list" ]]<- c(if (isTRUE(example_code )
7069&& ! isTRUE(attributes ))" rcpp_hello_world" ," Rcpp.fake.fun" )
71- }
70+ }
7271
73- tryCatch(eval(call ,envir = env ),error = function (e ){
74- stop(sprintf(" error while calling `package.skeleton` : %s" , conditionMessage(e )))
75- })
72+ tryCatch(eval(call ,envir = env ),error = function (e ){
73+ stop(sprintf(" error while calling `package.skeleton` : %s" , conditionMessage(e )))
74+ })
7675
77- message(" \n Adding Rcpp settings" )
76+ message(" \n Adding Rcpp settings" )
7877
79- # # now pick things up
80- root <- file.path(path ,name )
78+ # # now pick things up
79+ root <- file.path(path ,name )
8180
82- # Add Rcpp to the DESCRIPTION
83- DESCRIPTION <- file.path(root ," DESCRIPTION" )
84- if (file.exists(DESCRIPTION )) {
85- imports <- c(if (isTRUE(module ))" methods" ,
81+ # Add Rcpp to the DESCRIPTION
82+ DESCRIPTION <- file.path(root ," DESCRIPTION" )
83+ if (file.exists(DESCRIPTION )) {
84+ imports <- c(if (isTRUE(module ))" methods" ,
8685 sprintf(" Rcpp (>= %s)" , packageDescription(" Rcpp" )[[" Version" ]]))
87- x <- cbind(read.dcf(DESCRIPTION ),
86+ x <- cbind(read.dcf(DESCRIPTION ),
8887" Imports" = paste(imports ,collapse = " ," ),
8988" LinkingTo" = " Rcpp" )
90- x [," Author" ]<- author
91- x [," Maintainer" ]<- sprintf(" %s <%s>" ,maintainer ,email )
92- x [," License" ]<- license
93- message(" >> added Imports: Rcpp" )
94- message(" >> added LinkingTo: Rcpp" )
95- write.dcf(x ,file = DESCRIPTION )
89+ x [," Author" ]<- author
90+ x [," Maintainer" ]<- sprintf(" %s <%s>" ,maintainer ,email )
91+ x [," License" ]<- license
92+ x [," Title" ]<- " What the Package Does in One 'Title Case' Line"
93+ x [," Description" ]<- " One paragraph description of what the package does as one or more full sentences."
94+ message(" >> added Imports: Rcpp" )
95+ message(" >> added LinkingTo: Rcpp" )
96+ write.dcf(x ,file = DESCRIPTION )
9697
97- }
98+ }
9899
99- # # add useDynLib and importFrom to NAMESPACE
100- NAMESPACE <- file.path(root ," NAMESPACE" )
100+ # # add useDynLib and importFrom to NAMESPACE
101+ NAMESPACE <- file.path(root ," NAMESPACE" )
101102lines <- readLines(NAMESPACE )
102103ns <- file(NAMESPACE ,open = " w" )
103104if (! grepl(" useDynLib" ,lines )) {
@@ -114,98 +115,109 @@ Rcpp.package.skeleton <- function(name = "anRpackage", list = character(),
114115 }
115116 close(ns )
116117
117- # # update the package description help page
118+ # # update the package description help page
118119if (havePkgKitten ) {# if pkgKitten is available, use it
119120pkgKitten :: playWithPerPackageHelpPage(name ,path ,maintainer ,email )
120121 }else {
121- package_help_page <- file.path(root ," man" , sprintf(" %s-package.Rd" ,name ))
122- if (file.exists(package_help_page )) {
123- lines <- readLines(package_help_page )
124- lines <- gsub(" What license is it under?" ,license ,lines ,fixed = TRUE )
125- lines <- gsub(" Who to complain to <yourfault@somewhere.net>" ,
126- sprintf(" %s <%s>" ,maintainer ,email ),
127- lines ,fixed = TRUE )
128- lines <- gsub(" Who wrote it" ,author ,lines ,fixed = TRUE )
129- writeLines(lines ,package_help_page )
130- }
122+ .playWithPerPackageHelpPage(name ,path ,maintainer ,email )
131123 }
132124
133- # # lay things out in the src directory
134- src <- file.path(root ," src" )
135- if (! file.exists(src )) {
136- dir.create(src )
137- }
138- skeleton <- system.file(" skeleton" ,package = " Rcpp" )
139-
140- if (length(cpp_files )> 0L ) {
141- for (file in cpp_files ) {
142- file.copy(file ,src )
143- message(" >> copied" ,file ," to src directory" )
144- }
145- compileAttributes(root )
146- }
147-
148- if (example_code ) {
149- if (isTRUE(attributes )) {
150- file.copy(file.path(skeleton ," rcpp_hello_world_attributes.cpp" ),
125+ # # lay things out in the src directory
126+ src <- file.path(root ," src" )
127+ if (! file.exists(src )) {
128+ dir.create(src )
129+ }
130+ skeleton <- system.file(" skeleton" ,package = " Rcpp" )
131+
132+ if (length(cpp_files )> 0L ) {
133+ for (file in cpp_files ) {
134+ file.copy(file ,src )
135+ message(" >> copied" ,file ," to src directory" )
136+ }
137+ compileAttributes(root )
138+ }
139+
140+ if (example_code ) {
141+ if (isTRUE(attributes )) {
142+ file.copy(file.path(skeleton ," rcpp_hello_world_attributes.cpp" ),
151143 file.path(src ," rcpp_hello_world.cpp" ))
152- message(" >> added example src file using Rcpp attributes" )
153- compileAttributes(root )
154- message(" >> compiled Rcpp attributes" )
155- }else {
156- header <- readLines(file.path(skeleton ," rcpp_hello_world.h" ))
157- header <- gsub(" @PKG@" ,name ,header ,fixed = TRUE )
158- writeLines(header , file.path(src ," rcpp_hello_world.h" ))
159- message(" >> added example header file using Rcpp classes" )
160-
161- file.copy(file.path(skeleton ," rcpp_hello_world.cpp" ),src )
162- message(" >> added example src file using Rcpp classes" )
163-
164- rcode <- readLines(file.path(skeleton ," rcpp_hello_world.R" ))
165- rcode <- gsub(" @PKG@" ,name ,rcode ,fixed = TRUE )
166- writeLines(rcode , file.path(root ," R" ," rcpp_hello_world.R" ))
167- message(" >> added example R file calling the C++ example" )
168- }
169-
170- hello.Rd <- file.path(root ," man" ," rcpp_hello_world.Rd" )
171- unlink(hello.Rd )
172- file.copy(system.file(" skeleton" ," rcpp_hello_world.Rd" ,package = " Rcpp" ),hello.Rd )
173- message(" >> added Rd file for rcpp_hello_world" )
174- }
175-
176- if (isTRUE(module )) {
177- file.copy(system.file(" skeleton" ," rcpp_module.cpp" ,package = " Rcpp" ),
144+ message(" >> added example src file using Rcpp attributes" )
145+ compileAttributes(root )
146+ message(" >> compiled Rcpp attributes" )
147+ }else {
148+ header <- readLines(file.path(skeleton ," rcpp_hello_world.h" ))
149+ header <- gsub(" @PKG@" ,name ,header ,fixed = TRUE )
150+ writeLines(header , file.path(src ," rcpp_hello_world.h" ))
151+ message(" >> added example header file using Rcpp classes" )
152+
153+ file.copy(file.path(skeleton ," rcpp_hello_world.cpp" ),src )
154+ message(" >> added example src file using Rcpp classes" )
155+
156+ rcode <- readLines(file.path(skeleton ," rcpp_hello_world.R" ))
157+ rcode <- gsub(" @PKG@" ,name ,rcode ,fixed = TRUE )
158+ writeLines(rcode , file.path(root ," R" ," rcpp_hello_world.R" ))
159+ message(" >> added example R file calling the C++ example" )
160+ }
161+
162+ hello.Rd <- file.path(root ," man" ," rcpp_hello_world.Rd" )
163+ unlink(hello.Rd )
164+ file.copy(system.file(" skeleton" ," rcpp_hello_world.Rd" ,package = " Rcpp" ),hello.Rd )
165+ message(" >> added Rd file for rcpp_hello_world" )
166+ }
167+
168+ if (isTRUE(module )) {
169+ file.copy(system.file(" skeleton" ," rcpp_module.cpp" ,package = " Rcpp" ),
178170 file.path(root ," src" ))
179- file.copy(system.file(" skeleton" ," Num.cpp" ,package = " Rcpp" ),
171+ file.copy(system.file(" skeleton" ," Num.cpp" ,package = " Rcpp" ),
180172 file.path(root ," src" ))
181- file.copy(system.file(" skeleton" ," stdVector.cpp" ,package = " Rcpp" ),
173+ file.copy(system.file(" skeleton" ," stdVector.cpp" ,package = " Rcpp" ),
182174 file.path(root ," src" ))
183- file.copy(system.file(" skeleton" ," zzz.R" ,package = " Rcpp" ),
175+ file.copy(system.file(" skeleton" ," zzz.R" ,package = " Rcpp" ),
184176 file.path(root ," R" ))
185- file.copy(system.file(" skeleton" ," Rcpp_modules_examples.Rd" ,package = " Rcpp" ),
177+ file.copy(system.file(" skeleton" ," Rcpp_modules_examples.Rd" ,package = " Rcpp" ),
186178 file.path(root ," man" ))
187- message(" >> copied the example module file" )
188- }
179+ message(" >> copied the example module file" )
180+ }
181+
182+ lines <- readLines(package.doc <- file.path(root ," man" , sprintf(" %s-package.Rd" ,name )))
183+ lines <- sub(" ~~ simple examples" ," %% ~~ simple examples" ,lines )
189184
190- lines <- readLines(package.doc <- file.path(root ," man" , sprintf(" %s-package.Rd" ,name )))
191- lines <- sub(" ~~ simple examples" ," %% ~~ simple examples" ,lines )
185+ lines <- lines [! grepl(" ~~ package title" ,lines )]
186+ lines <- lines [! grepl(" ~~ The author and" ,lines )]
187+ lines <- sub(" Who wrote it" ,author ,lines )
188+ lines <- sub(" Who to complain to.*" , sprintf(" %s <%s>" ,maintainer ,email ),lines )
192189
193- lines <- lines [! grepl(" ~~ package title" ,lines )]
194- lines <- lines [! grepl(" ~~ The author and" ,lines )]
195- lines <- sub(" Who wrote it" ,author ,lines )
196- lines <- sub(" Who to complain to.*" , sprintf(" %s <%s>" ,maintainer ,email ),lines )
190+ writeLines(lines ,package.doc )
197191
198- writeLines(lines ,package.doc )
192+ if (fake ) {
193+ rm(" Rcpp.fake.fun" ,envir = env )
194+ unlink(file.path(root ," R" ," Rcpp.fake.fun.R" ))
195+ unlink(file.path(root ," man" ," Rcpp.fake.fun.Rd" ))
196+ }
199197
200- if (fake ) {
201- rm(" Rcpp.fake.fun" ,envir = env )
202- unlink(file.path(root ," R" ," Rcpp.fake.fun.R" ))
203- unlink(file.path(root ," man" ," Rcpp.fake.fun.Rd" ))
204- }
198+ if (isTRUE(remove_hello_world )) {
199+ rm(" rcpp_hello_world" ,envir = env )
200+ }
205201
206- if (isTRUE(remove_hello_world )) {
207- rm(" rcpp_hello_world" ,envir = env )
208- }
202+ invisible (NULL )
203+ }
209204
210- invisible (NULL )
205+ # # Borrowed with love from pkgKitten, and modified slightly
206+ .playWithPerPackageHelpPage <- function (name = " anRpackage" ,
207+ path = " ." ,
208+ maintainer = " Your Name" ,
209+ email = " your@mail.com" ) {
210+ root <- file.path(path ,name )
211+ helptgt <- file.path(root ," man" , sprintf(" %s-package.Rd" ,name ))
212+ helpsrc <- system.file(" skeleton" ," manual-page-stub.Rd" ,package = " Rcpp" )
213+ # # update the package description help page
214+ if (file.exists(helpsrc )) {
215+ lines <- readLines(helpsrc )
216+ lines <- gsub(" __placeholder__" ,name ,lines ,fixed = TRUE )
217+ lines <- gsub(" Who to complain to <yourfault@somewhere.net>" ,
218+ sprintf(" %s <%s>" ,maintainer ,email ),
219+ lines ,fixed = TRUE )
220+ writeLines(lines ,helptgt )
221+ }
222+ invisible (NULL )
211223}