-
Notifications
You must be signed in to change notification settings - Fork 285
/
rcpp.R
111 lines (89 loc) · 2.84 KB
/
rcpp.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
#' Use C, C++, RcppArmadillo, or RcppEigen
#'
#' Adds infrastructure commonly needed when using compiled code:
#' * Creates `src/`
#' * Adds required packages to `DESCRIPTION`
#' * May create an initial placeholder `.c` or `.cpp` file
#' * Creates `Makevars` and `Makevars.win` files (`use_rcpp_armadillo()` only)
#'
#' @inheritParams use_r
#' @export
use_rcpp <- function(name = NULL) {
check_is_package("use_rcpp()")
check_uses_roxygen("use_rcpp()")
use_dependency("Rcpp", "LinkingTo")
use_dependency("Rcpp", "Imports")
roxygen_ns_append("@importFrom Rcpp sourceCpp") && roxygen_remind()
use_src()
path <- path("src", compute_name(name, "cpp"))
use_template("code.cpp", path)
edit_file(proj_path(path))
invisible()
}
#' @rdname use_rcpp
#' @export
use_rcpp_armadillo <- function(name = NULL) {
use_rcpp(name)
use_dependency("RcppArmadillo", "LinkingTo")
makevars_settings <- list(
"CXX_STD" = "CXX11",
"PKG_CXXFLAGS" = "$(SHLIB_OPENMP_CXXFLAGS)",
"PKG_LIBS" = "$(SHLIB_OPENMP_CXXFLAGS) $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)"
)
use_makevars(makevars_settings)
invisible()
}
#' @rdname use_rcpp
#' @export
use_rcpp_eigen <- function(name = NULL) {
use_rcpp(name)
use_dependency("RcppEigen", "LinkingTo")
roxygen_ns_append("@import RcppEigen") && roxygen_remind()
invisible()
}
#' @rdname use_rcpp
#' @export
use_c <- function(name = NULL) {
check_is_package("use_c()")
check_uses_roxygen("use_c()")
use_src()
path <- path("src", compute_name(name, ext = "c"))
use_template("code.c", path)
edit_file(proj_path(path))
invisible(TRUE)
}
use_src <- function() {
use_directory("src")
use_git_ignore(c("*.o", "*.so", "*.dll"), "src")
roxygen_ns_append(glue("@useDynLib {project_name()}, .registration = TRUE")) &&
roxygen_remind()
invisible()
}
use_makevars <- function(settings = NULL) {
use_directory("src")
settings_list <- settings %||% list()
check_is_named_list(settings_list)
makevars_entries <- vapply(settings_list, glue_collapse, character(1))
makevars_content <- glue("{names(makevars_entries)} = {makevars_entries}")
makevars_path <- proj_path("src", "Makevars")
makevars_win_path <- proj_path("src", "Makevars.win")
if (!file_exists(makevars_path) && !file_exists(makevars_win_path)) {
write_utf8(makevars_path, makevars_content)
file_copy(makevars_path, makevars_win_path)
ui_bullets(c(
"v" = "Created {.path {pth(makevars_path)}} and
{.path {pth(makevars_win_path)}} with requested compilation settings."
))
} else {
ui_bullets(c(
"_" = "Ensure the following Makevars compilation settings are set for both
{.path {pth(makevars_path)}} and {.path {pth(makevars_win_path)}}:"
))
ui_code_snippet(
makevars_content,
language = ""
)
edit_file(makevars_path)
edit_file(makevars_win_path)
}
}