# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import os
from spack.package import *
class Rstudio(CMakePackage):
"""RStudio is an integrated development environment (IDE) for R."""
homepage = "www.rstudio.com/products/rstudio/"
url = "https://github.com/rstudio/rstudio/archive/refs/tags/v1.4.1717.tar.gz"
version("1.4.1717", sha256="3af234180fd7cef451aef40faac2c7b52860f14a322244c1c7aede029814d261")
variant("notebook", default=False, description="Enable notebook support.")
depends_on("r@3.0.1:", type=("build", "run"))
depends_on("cmake@3.4.3:", type="build")
depends_on("pkgconfig", type="build")
depends_on("ant", type="build")
depends_on("boost+pic@1.69:")
depends_on("qt+webkit@5.12:")
depends_on("patchelf@0.9:")
depends_on("yaml-cpp@:0.6.3") # find_package fails with newest version
depends_on("node-js")
depends_on("yarn")
depends_on("pandoc@2.11.4:")
depends_on("icu4c")
depends_on("soci~static+boost+postgresql+sqlite")
depends_on("java@8:")
with when("+notebook"):
depends_on("r-base64enc")
depends_on("r-digest")
depends_on("r-evaluate")
depends_on("r-glue")
depends_on("r-highr")
depends_on("r-htmltools")
depends_on("r-jsonlite")
depends_on("r-knitr")
depends_on("r-magrittr")
depends_on("r-markdown")
depends_on("r-mime")
depends_on("r-rmarkdown")
depends_on("r-stringi")
depends_on("r-stringr")
depends_on("r-tinytex")
depends_on("r-xfun")
depends_on("r-yaml")
# to use node-js provided by spack
patch(
"https://src.fedoraproject.org/rpms/rstudio/raw/5bda2e290c9e72305582f2011040938d3e356906/f/0004-use-system-node.patch",
sha256="4a6aff2b586ddfceb7c59215e5f4a03f25b08fcc55687acaa6ae23c11d75d0e8",
)
def cmake_args(self):
args = [
"-DRSTUDIO_TARGET=Desktop",
"-DRSTUDIO_PACKAGE_BUILD=Yes",
"-DRSTUDIO_USE_SYSTEM_YAML_CPP=Yes",
"-DRSTUDIO_USE_SYSTEM_BOOST=Yes",
"-DRSTUDIO_USE_SYSTEM_SOCI=Yes",
'-DQT_QMAKE_EXECUTABLE="{0}"'.format(self.spec["qt"].prefix.bin.qmake),
]
return args
def setup_build_environment(self, env):
env.set("RSTUDIO_TOOLS_ROOT", self.prefix.tools)
def patch(self):
# fix hardcoded path for node-js in use_system_node patch
filter_file(
'',
''.format(self.spec["node-js"].prefix.bin.node),
"src/gwt/build.xml",
string=True,
)
# remove hardcoded soci path to use spack soci
if self.spec["soci"].version <= Version("4.0.0"):
soci_lib = self.spec["soci"].prefix.lib64
else:
soci_lib = self.spec["soci"].prefix.lib
filter_file(
'set(SOCI_LIBRARY_DIR "/usr/lib")',
'set(SOCI_LIBRARY_DIR "{0}")'.format(soci_lib),
"src/cpp/CMakeLists.txt",
string=True,
)
# unbundle icu libraries
filter_file(
"${QT_LIBRARY_DIR}/${ICU_LIBRARY}.so",
join_path(self.spec["icu4c"].prefix.lib, "${ICU_LIBRARY}.so"),
"src/cpp/desktop/CMakeLists.txt",
string=True,
)
@run_before("cmake")
def install_deps(self):
deps = Executable("./dependencies/common/install-dictionaries")
deps()
deps = Executable("./dependencies/common/install-mathjax")
deps()
# two methods for pandoc
# 1) replace install-pandoc:
# - link pandoc into tools/pandoc/$PANDOC_VERSION
# (this is what install-pandoc would do)
# - cmake then installs pandoc files from there into bin
# 2) remove install-pandoc and cmake install step + link directly into bin
# method 1)
filter_file(
'set(PANDOC_VERSION "2.11.4" CACHE INTERNAL "Pandoc version")',
'set(PANDOC_VERSION "{0}" CACHE INTERNAL "Pandoc version")'.format(
self.spec["pandoc"].version
),
"src/cpp/session/CMakeLists.txt",
string=True,
)
pandoc_dir = join_path(self.prefix.tools, "pandoc", self.spec["pandoc"].version)
os.makedirs(pandoc_dir)
with working_dir(pandoc_dir):
os.symlink(self.spec["pandoc"].prefix.bin.pandoc, "pandoc")
os.symlink(
os.path.join(self.spec["pandoc"].prefix.bin, "pandoc-citeproc"), "pandoc-citeproc"
)