From dc20d9539ece9db704a616094aed9069ee7b89a7 Mon Sep 17 00:00:00 2001 From: Jacob Wujciak-Jens Date: Thu, 21 Mar 2024 18:36:01 +0100 Subject: [PATCH] GH-39147: [R] Add Bootstrap.r (#39148) ### Rationale for this change Currently installing via github is not possible because the vendoring of the cpp source isn't happening. We can use bootstrap.R to do it. (Does not work for `devtools::install_local()` as that copies the source folder before running bootstrap.R) ### What changes are included in this PR? An R'ified version of `make sync-cpp` ### Are these changes tested? locally ### Are there any user-facing changes? Yes, installing via `devtools::install_github()` will now properly vendor the cpp files. * Closes: #39147 * GitHub Issue: #39147 Lead-authored-by: Jacob Wujciak-Jens Co-authored-by: Dewey Dunnington Signed-off-by: Jacob Wujciak-Jens --- r/.Rbuildignore | 1 + r/DESCRIPTION | 1 + r/Makefile | 2 +- r/bootstrap.R | 78 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 r/bootstrap.R diff --git a/r/.Rbuildignore b/r/.Rbuildignore index f5eeba4117454..7ec279d8862b2 100644 --- a/r/.Rbuildignore +++ b/r/.Rbuildignore @@ -30,3 +30,4 @@ STYLE.md ^vignettes$ ^PACKAGING\.md$ ^inst/__pycache__$ +^bootstrap.R$ diff --git a/r/DESCRIPTION b/r/DESCRIPTION index c6726523e68e9..81b5d79258255 100644 --- a/r/DESCRIPTION +++ b/r/DESCRIPTION @@ -45,6 +45,7 @@ Imports: Roxygen: list(markdown = TRUE, r6 = FALSE, load = "source") RoxygenNote: 7.2.3 Config/testthat/edition: 3 +Config/build/bootstrap: TRUE Suggests: blob, curl, diff --git a/r/Makefile b/r/Makefile index 514f5adf4e144..c3267e8cfe45b 100644 --- a/r/Makefile +++ b/r/Makefile @@ -67,5 +67,5 @@ clean: -rm src/Makevars.win -rm -rf arrow.Rcheck/ -rm -rf libarrow/ - -rm -rf tools/cpp/ tools/.env tools/NOTICE.txt tools/LICENSE.txt tools/checksums + -rm -rf tools/cpp/ tools/dotenv tools/NOTICE.txt tools/LICENSE.txt tools/checksums -find . -name "*.orig" -delete diff --git a/r/bootstrap.R b/r/bootstrap.R new file mode 100644 index 0000000000000..a0c90b03e2c7f --- /dev/null +++ b/r/bootstrap.R @@ -0,0 +1,78 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + + + +# exclude_patterns are regular expressions so use ^ to match top-level +# directories only. Otherwise 'dir' will match 'src/dir' and 'dir/file'. +rsync <- function(src_dir, dest_dir, exclude_patterns) { + all_files <- list.files(src_dir, recursive = TRUE) + + # Filter out excluded patterns + for (pattern in exclude_patterns) { + all_files <- all_files[!grepl(pattern, all_files)] + } + + files_to_vendor_src <- file.path(src_dir, all_files) + files_to_vendor_dst <- file.path(dest_dir, all_files) + + # Recreate the directory structure + dst_dirs <- unique(dirname(files_to_vendor_dst)) + for (dst_dir in dst_dirs) { + if (!dir.exists(dst_dir)) { + dir.create(dst_dir, recursive = TRUE) + } + } + + # Copy the files + if (all(file.copy(files_to_vendor_src, files_to_vendor_dst, overwrite = TRUE))) { + cat("All files successfully copied to tools/cpp\n") + } else { + stop("Failed to vendor all files") + } +} + + +if (dir.exists("../cpp")) { + unlink("tools/cpp", recursive = TRUE) + rsync("../cpp", + "tools/cpp", + exclude_patterns = c( + "^apidoc", + "^build/", + "^build-support/boost-", + "^examples", + "^submodules", + "^src/gandiva", + "^src/jni", + "^src/skyhook", + "_test\\.cc" + ) + ) + + # The thirdparty cmake expects .env, NOTICE.txt, and LICENSE.txt to be available one + # level up from cpp/ we must rename .env to dotenv and then replace references to it + # in cpp/CMakeLists.txt, because R CMD will produce a Note otherwise. + file.copy(from = c("../NOTICE.txt", to = "../LICENSE.txt"), "tools/", overwrite = TRUE) + file.copy("../.env", "tools/dotenv", overwrite = TRUE) + + cmake_lists <- readLines("tools/cpp/CMakeLists.txt") + cmake_lists <- gsub("\\.env", "dotenv", cmake_lists) + writeLines(cmake_lists, "tools/cpp/CMakeLists.txt") +} else { + cli::cli_alert_warning("Arrow C++ sources not found, skipping bootstrap.") +}