Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vendor path #353

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion DESCRIPTION
Original file line number Diff line number Diff line change
Expand Up @@ -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
83 changes: 65 additions & 18 deletions R/vendor.R
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,12 @@
#' '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 _remove_ `LinkingTo:
#' cpp11` from your DESCRIPTION.
#'
#' **Note**: vendoring places the responsibility of updating the code on
#' **you**. Bugfixes and new features in cpp11 will not be available for your
#' code until you run `cpp_vendor()` again.
#'
#' @inheritParams cpp_register
#' @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
Expand All @@ -30,34 +28,83 @@
#'
#' # cleanup
#' unlink(dir, recursive = TRUE)
cpp_vendor <- function(path = ".") {
new <- file.path(path, "inst", "include", "cpp11")
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)
}

path <- paste0(dir, subdir)

if (dir.exists(new)) {
stop("'", new, "' already exists\n * run unlink('", new, "', recursive = TRUE)", call. = FALSE)
path2 <- file.path(path, "cpp11")
if (dir.exists(path2)) {
stop("'", path2, "' already exists\n * run unlink('", path2, "', recursive = TRUE)", call. = FALSE)
}

dir.create(new , recursive = TRUE, showWarnings = FALSE)
# Vendor cpp11 ----

dir.create(
path2,
recursive = TRUE,
showWarnings = FALSE
)

current <- system.file("include", "cpp11", package = "cpp11")
if (!nzchar(current)) {
current_cpp11 <- system.file(
"include",
"cpp11",
package = "cpp11"
)

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())
cpp11_header <- sprintf(
"// cpp11 version: %s\n// vendored on: %s",
cpp11_version,
Sys.Date()
)

write_header(
path, "cpp11.hpp", "cpp11",
cpp11_header
)

copy_files(
list.files(current_cpp11, full.names = TRUE),
path, "cpp11", cpp11_header
)

# Additional steps to make vendoring work ----

message(paste(
"Makevars and/or Makevars.win should have a line such as",
"'PKG_CPPFLAGS = -I../inst/include'"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this now need to show the new path?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

that line is added automatically, and uses the path the user wants

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i reallize i never pushed that change, done now

))

files <- list.files(current, full.names = TRUE)
message("DESCRIPTION should not have lines such as 'LinkingTo: cpp11'")

invisible(path)
}

write_header <- function(path, header, pkg, cpp11armadillo_header) {
writeLines(
c(cpp11_header, readLines(system.file("include", "cpp11.hpp", package = "cpp11"))),
file.path(dirname(new), "cpp11.hpp")
c(
cpp11armadillo_header,
readLines(
system.file("include", header, package = pkg)
)
),
file.path(path, header)
)
}

copy_files <- function(files, path, out, cpp11armadillo_header) {
for (f in files) {
writeLines(c(cpp11_header, readLines(f)), file.path(new, basename(f)))
writeLines(
c(cpp11armadillo_header, readLines(f)),
file.path(path, out, basename(f))
)
}

invisible(new)
}
8 changes: 4 additions & 4 deletions man/cpp_vendor.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading