- Notifications
You must be signed in to change notification settings - Fork 59
/
Copy pathskeleton.R
150 lines (132 loc) · 4.93 KB
/
skeleton.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#' Create a skeleton for a new package depending on RcppParallel
#'
#' \code{RcppParallel.package.skeleton} automates the creation of a new source
#' package that intends to use features of RcppParallel.
#'
#' It is based on the \link[utils]{package.skeleton} function which it executes
#' first.
#'
#' In addition to \link[Rcpp]{Rcpp.package.skeleton} :
#'
#' The \samp{DESCRIPTION} file gains an Imports line requesting that the
#' package depends on RcppParallel and a LinkingTo line so that the package
#' finds RcppParallel header files.
#'
#' The \samp{NAMESPACE} gains a \code{useDynLib} directive as well as an
#' \code{importFrom(RcppParallel, evalCpp} to ensure instantiation of
#' RcppParallel.
#'
#' The \samp{src} directory is created if it does not exists and a
#' \samp{Makevars} file is added setting the environment variables
#' \samp{PKG_LIBS} to accomodate the necessary flags to link with the
#' RcppParallel library.
#'
#' If the \code{example_code} argument is set to \code{TRUE}, example files
#' \samp{vector-sum.cpp} is created in the \samp{src} directory.
#' \code{Rcpp::compileAttributes()} is then called to generate
#' \code{src/RcppExports.cpp} and \code{R/RcppExports.R}. These files are given
#' as an example and should eventually by removed from the generated package.
#'
#' @param name The name of your R package.
#' @param example_code If \code{TRUE}, example C++ code using RcppParallel is
#' added to the package.
#' @param ... Optional arguments passed to \link[Rcpp]{Rcpp.package.skeleton}.
#' @return Nothing, used for its side effects
#' @seealso \link[utils]{package.skeleton}
#' @references Read the \emph{Writing R Extensions} manual for more details.
#'
#' Once you have created a \emph{source} package you need to install it: see
#' the \emph{R Installation and Administration} manual, \code{\link{INSTALL}}
#' and \code{\link{install.packages}}.
#' @keywords programming
#' @examples
#'
#' \dontrun{
#' # simple package
#' RcppParallel.package.skeleton("foobar")
#' }
#'
#' @export RcppParallel.package.skeleton
RcppParallel.package.skeleton<-function(name="anRpackage",
example_code=TRUE,
...)
{
# call Rcpp.package.skeleton() -- provide 'list' explicitly
# and clean up after
env<- new.env(parent= emptyenv())
env$dummy<-NULL
Rcpp::Rcpp.package.skeleton(
name=name,
attributes=FALSE,
module=FALSE,
example_code=FALSE,
environment=env,
list="dummy",
...
)
# move to generated package directory
owd<- setwd(name)
on.exit(setwd(owd), add=TRUE)
# remove dummy stuff
unlink("data", recursive=TRUE)
unlink("man/dummy.Rd")
unlink("Read-and-delete-me")
lns<- readLines("NAMESPACE")
writeLines(lns[!grepl("dummy", lns)], "NAMESPACE")
unlink("src/init.c")
message("\nAdding RcppParallel settings")
# update DESCRIPTION file
desc<- read.dcf("DESCRIPTION", all=TRUE, keep.white=TRUE)
version<- sprintf("RcppParallel (>= %s)", utils::packageVersion("RcppParallel"))
desc$Imports<- paste0(desc$Imports, ", ", version)
message(" >> added Imports: ", desc$Imports)
desc$LinkingTo<- paste0(desc$LinkingTo, ", RcppParallel")
message(" >> added LinkingTo: ", desc$LinkingTo)
desc$SystemRequirements<-"GNU make"
message(" >> added SystemRequirements: GNU make")
write.dcf(desc, file="DESCRIPTION", keep.white=TRUE)
# update NAMESPACE file
message(" >> added importFrom(RcppParallel,RcppParallelLibs) directive to NAMESPACE")
cat("importFrom(RcppParallel,RcppParallelLibs)",
file="NAMESPACE",
sep="\n",
append=TRUE)
# write Makevars files
dir.create("src", showWarnings=FALSE)
# src/Makevars
message(" >> added src/Makevars")
cat(
c(
'# We also need importFrom(RcppParallel,RcppParallelLibs) in NAMESPACE',
'PKG_LIBS += $(shell ${R_HOME}/bin/Rscript -e "RcppParallel::RcppParallelLibs()")'
),
file="src/Makevars",
sep="\n"
)
# src/Makevars.win
message(" >> added src/Makevars.win")
cat(
c(
'PKG_CXXFLAGS += -DRCPP_PARALLEL_USE_TBB=1',
'PKG_LIBS += $(shell "${R_HOME}/bin${R_ARCH_BIN}/Rscript.exe" -e "RcppParallel::RcppParallelLibs()")'
),
file="src/Makevars.win",
sep="\n"
)
# write an example script using RcppParallel
if (example_code) {
message(" >> added example file src/vector-sum.cpp")
file.copy(
system.file("skeleton/vector-sum.cpp", package="RcppParallel"),
"src/vector-sum.cpp"
)
message(" >> added example documentation man/vector-sum.Rd")
file.copy(
system.file("skeleton/vector-sum.Rd", package="RcppParallel"),
"man/vector-sum.Rd"
)
message(" >> compiled Rcpp attributes")
Rcpp::compileAttributes()
}
TRUE
}