diff --git a/DESCRIPTION b/DESCRIPTION index 5f69870b..e312ad37 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -55,4 +55,4 @@ Config/Needs/cpp11/cpp_register: vctrs Encoding: UTF-8 Roxygen: list(markdown = TRUE) -RoxygenNote: 7.2.3 +RoxygenNote: 7.3.1 diff --git a/R/vendor.R b/R/vendor.R index 2f4048f3..a7e40fbb 100644 --- a/R/vendor.R +++ b/R/vendor.R @@ -12,7 +12,8 @@ #' **you**. Bugfixes and new features in cpp11 will not be available for your #' code until you run `cpp_vendor()` again. #' -#' @param path The path to vendor the code into. +#' @param dir The directoyy to vendor the code into. +#' @param subdir The subdirectory to vendor the code into. #' @return The file path to the vendored code (invisibly). #' @export #' @examples @@ -27,42 +28,53 @@ #' #' # cleanup #' unlink(dir, recursive = TRUE) -cpp_vendor <- function(path = NULL) { - if (is.null(path)) { +cpp_vendor <- function(dir = NULL, subdir = "/inst/include") { + if (is.null(dir)) { stop("You must provide a path to vendor the code into", call. = FALSE) - } else { - path <- paste0(path, "/inst/include") } - - new <- file.path(path) - if (dir.exists(new)) { - stop("'", new, "' already exists\n * run unlink('", new, "', recursive = TRUE)", call. = FALSE) + path <- paste0(dir, subdir) + + path2 <- file.path(path, "cpp11") + if (dir.exists(path2)) { + stop("'", path2, "' already exists\n * run unlink('", path2, "', recursive = TRUE)", call. = FALSE) } # Vendor cpp11 ---- - dir.create(new, recursive = TRUE, showWarnings = FALSE) - dir.create(file.path(new, "cpp11"), recursive = TRUE, showWarnings = FALSE) + dir.create( + path2, + recursive = TRUE, + showWarnings = FALSE + ) - current <- system.file("include", "cpp11", package = "cpp11") + current_cpp11 <- system.file( + "include", + "cpp11", + package = "cpp11" + ) - if (!nzchar(current)) { + if (!nzchar(current_cpp11)) { stop("cpp11 is not installed", call. = FALSE) } cpp11_version <- utils::packageVersion("cpp11") - cpp11_header <- sprintf("// cpp11 version: %s\n// vendored on: %s", cpp11_version, Sys.Date()) - - main_header <- list.files(current, pattern = "\\.hpp$", full.names = TRUE) - headers <- list.files(file.path(current, "cpp11"), pattern = "\\.hpp$", full.names = TRUE) + cpp11_header <- sprintf( + "// cpp11 version: %s\n// vendored on: %s", + cpp11_version, + Sys.Date() + ) - writeLines(c(cpp11_header, readLines(main_header)), file.path(new, basename(main_header))) + write_header( + path, "cpp11.hpp", "cpp11", + cpp11_header + ) - for (h in headers) { - writeLines(c(cpp11_header, readLines(h)), file.path(new, "cpp11", basename(h))) - } + copy_files( + list.files(current_cpp11, full.names = TRUE), + path, "cpp11", cpp11_header + ) # Additional steps to make vendoring work ---- @@ -73,23 +85,25 @@ cpp_vendor <- function(path = NULL) { message("DESCRIPTION should not have lines such as 'LinkingTo: cpp11'") - invisible(new) + invisible(path) } -write_header <- function(path, header, pkg, cpp11_header) { +write_header <- function(path, header, pkg, cpp11armadillo_header) { writeLines( c( - cpp11_header, - readLines(system.file("include", header, package = pkg)) + cpp11armadillo_header, + readLines( + system.file("include", header, package = pkg) + ) ), file.path(path, header) ) } -copy_files <- function(files, path, out, cpp11_header) { +copy_files <- function(files, path, out, cpp11armadillo_header) { for (f in files) { writeLines( - c(cpp11_header, readLines(f)), + c(cpp11armadillo_header, readLines(f)), file.path(path, out, basename(f)) ) } diff --git a/man/cpp_vendor.Rd b/man/cpp_vendor.Rd index d52bf3ba..0fd75e0a 100644 --- a/man/cpp_vendor.Rd +++ b/man/cpp_vendor.Rd @@ -4,11 +4,12 @@ \alias{cpp_vendor} \title{Vendor the cpp11 dependency} \usage{ -cpp_vendor(path = "./inst/include/") +cpp_vendor(dir = NULL, subdir = "/inst/include") } \arguments{ -\item{path}{The path to vendor the code into. The default is -\verb{./inst/include/}.} +\item{dir}{The directoyy to vendor the code into.} + +\item{subdir}{The subdirectory to vendor the code into.} } \value{ The file path to the vendored code (invisibly). @@ -23,8 +24,6 @@ headers into the \code{inst/include} folder of your package and adding 'cpp11 version: XYZ' to the top of the files, where XYZ is the version of cpp11 currently installed on your machine. -If you choose to vendor the headers you should \emph{remove} \code{LinkingTo: cpp11} from your DESCRIPTION. This is done automatically by this function. - \strong{Note}: vendoring places the responsibility of updating the code on \strong{you}. Bugfixes and new features in cpp11 will not be available for your code until you run \code{cpp_vendor()} again. diff --git a/tests/testthat/test-vendor.R b/tests/testthat/test-vendor.R index 658c999f..361c9ad9 100644 --- a/tests/testthat/test-vendor.R +++ b/tests/testthat/test-vendor.R @@ -22,10 +22,10 @@ describe("cpp_vendor", { pkg <- local_package() p <- pkg_path(pkg) - cpp_vendor(file.path(pkg_path(pkg), "inst/include")) + cpp_vendor(pkg_path(pkg)) - expect_true(dir.exists(file.path(p, "cpp11"))) - expect_true(file.exists(file.path(p, "cpp11.hpp"))) - expect_true(file.exists(file.path(p, "cpp11", "declarations.hpp"))) + expect_true(dir.exists(file.path(p, "inst", "include", "cpp11"))) + expect_true(file.exists(file.path(p, "inst", "include", "cpp11.hpp"))) + expect_true(file.exists(file.path(p, "inst", "include", "cpp11", "declarations.hpp"))) }) })