blob: 4887d8eefa367653cd8b064020abc6c2ce50aceb [file] [log] [blame]
# 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.
#' Help installing the Arrow C++ library
#'
#' Binary package installations should come with a working Arrow C++ library,
#' but when installing from source, you'll need to obtain the C++ library
#' first. This function offers guidance on how to get the C++ library depending
#' on your operating system and package version.
#' @export
#' @importFrom utils packageVersion installed.packages
install_arrow <- function() {
os <- tolower(Sys.info()[["sysname"]])
# c("windows", "darwin", "linux", "sunos") # win/mac/linux/solaris
version <- packageVersion("arrow")
# From CRAN check:
rep <- installed.packages(fields="Repository")["arrow", "Repository"]
from_cran <- identical(rep, "CRAN")
# Is it possible to tell if was a binary install from CRAN vs. source?
message(install_arrow_msg(arrow_available(), version, from_cran, os))
}
install_arrow_msg <- function(has_arrow, version, from_cran, os) {
# TODO: check if there is a newer version on CRAN?
# install_arrow() sends "version" as a "package_version" class, but for
# convenience, this also accepts a string like "0.13.0". Calling
# `package_version` is idempotent so do it again, and then `unclass` to get
# the integers. Then see how many there are.
dev_version <- length(unclass(package_version(version))[[1]]) > 3
# Based on these parameters, assemble a string with installation advice
if (has_arrow) {
# Respond that you already have it
msg <- ALREADY_HAVE
} else if (os == "sunos") {
# Good luck with that.
msg <- c(SEE_DEV_GUIDE, THEN_REINSTALL)
} else if (os == "linux") {
if (dev_version) {
# Point to compilation instructions on readme
msg <- c(SEE_DEV_GUIDE, THEN_REINSTALL)
} else {
# Suggest arrow.apache.org/install for PPAs, or compilation instructions
msg <- c(paste(SEE_ARROW_INSTALL, OR_SEE_DEV_GUIDE), THEN_REINSTALL)
}
} else if (!dev_version && !from_cran) {
# Windows or Mac with a released version but not from CRAN
# Recommend installing released binary package from CRAN
msg <- INSTALL_FROM_CRAN
} else {
# Windows or Mac, most likely a dev version
# for each OS, recommend dev installation, refer to readme
# TODO: if there is a newer version on CRAN, recommend CRAN
if (os == "windows") {
msg <- c(paste(FIND_WIN_BINARY, OR_SEE_DEV_GUIDE), THEN_REINSTALL)
} else {
# macOS
msg <- c(paste(FIND_MAC_BINARY, OR_SEE_DEV_GUIDE), THEN_REINSTALL)
}
}
# Common postscript
msg <- c(msg, SEE_README, REPORT_ISSUE)
paste(msg, collapse="\n\n")
}
ALREADY_HAVE <- paste(
"It appears you already have Arrow installed successfully:",
"are you trying to install a different version of the library?"
)
SEE_DEV_GUIDE <- paste(
"See the Arrow C++ developer guide",
"<https://arrow.apache.org/docs/developers/cpp.html>",
"for instructions on building the library from source."
)
# Variation of that
OR_SEE_DEV_GUIDE <- paste0(
"Or, s",
substr(SEE_DEV_GUIDE, 2, nchar(SEE_DEV_GUIDE))
)
SEE_ARROW_INSTALL <- paste(
"See the Apache Arrow project installation page",
"<https://arrow.apache.org/install/>",
"for how to install the C++ package from a PPA."
)
THEN_REINSTALL <- paste(
"After you've installed the C++ library,",
"you'll need to reinstall the R package from source to find it."
)
SEE_README <- paste(
"Refer to the R package README",
"<https://github.com/apache/arrow/blob/master/r/README.md>",
"for further details."
)
REPORT_ISSUE <- paste(
"If you have other trouble, or if you think this message could be improved,",
"please report an issue here:",
"<https://issues.apache.org/jira/projects/ARROW/issues>"
)
INSTALL_FROM_CRAN <- paste(
'Try installing the package from CRAN:',
'`install.packages("arrow")`'
)
FIND_WIN_BINARY <- paste(
"You may be able to download a development version of the C++ binary",
"from the Apache Arrow project's Appveyor:",
"<https://ci.appveyor.com/project/ApacheSoftwareFoundation/arrow>.",
"Select an R job from a recent build,",
'and download the `build\arrow-*.zip` file from the "Artifacts" tab.',
"Then, set the RWINLIB_LOCAL environment variable to point to that file."
)
FIND_MAC_BINARY <- paste(
"You may be able to get a development version of the Arrow C++ library",
"using Homebrew: `brew install apache-arrow --HEAD`"
)