about summary refs log tree commit diff
path: root/nixpkgs/pkgs/applications/editors/rstudio/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/applications/editors/rstudio/default.nix')
-rw-r--r--nixpkgs/pkgs/applications/editors/rstudio/default.nix239
1 files changed, 239 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/applications/editors/rstudio/default.nix b/nixpkgs/pkgs/applications/editors/rstudio/default.nix
new file mode 100644
index 000000000000..2d8b3c2bb09c
--- /dev/null
+++ b/nixpkgs/pkgs/applications/editors/rstudio/default.nix
@@ -0,0 +1,239 @@
+{ lib
+, stdenv
+, mkDerivation
+, fetchurl
+, fetchpatch
+, fetchFromGitHub
+, makeDesktopItem
+, copyDesktopItems
+, cmake
+, boost
+, zlib
+, openssl
+, R
+, qtbase
+, qtxmlpatterns
+, qtsensors
+, qtwebengine
+, qtwebchannel
+, libuuid
+, hunspellDicts
+, unzip
+, ant
+, jdk
+, gnumake
+, makeWrapper
+, pandoc
+, llvmPackages
+, yaml-cpp
+, soci
+, postgresql
+, nodejs
+, mkYarnModules
+, qmake
+, server ? false # build server version
+, sqlite
+, pam
+, nixosTests
+}:
+
+let
+  pname = "RStudio";
+  version = "2022.07.1+554";
+  RSTUDIO_VERSION_MAJOR  = "2022";
+  RSTUDIO_VERSION_MINOR  = "07";
+  RSTUDIO_VERSION_PATCH  = "1";
+  RSTUDIO_VERSION_SUFFIX = "+554";
+
+  src = fetchFromGitHub {
+    owner = "rstudio";
+    repo = "rstudio";
+    rev = "v${version}";
+    sha256 = "0rmdqxizxqg2vgr3lv066cjmlpjrxjlgi0m97wbh6iyhkfm2rrj1";
+  };
+
+  mathJaxSrc = fetchurl {
+    url = "https://s3.amazonaws.com/rstudio-buildtools/mathjax-27.zip";
+    sha256 = "sha256-xWy6psTOA8H8uusrXqPDEtL7diajYCVHcMvLiPsgQXY=";
+  };
+
+  rsconnectSrc = fetchFromGitHub {
+    owner = "rstudio";
+    repo = "rsconnect";
+    rev = "e287b586e7da03105de3faa8774c63f08984eb3c";
+    sha256 = "sha256-ULyWdSgGPSAwMt0t4QPuzeUE6Bo6IJh+5BMgW1bFN+Y=";
+  };
+
+  panmirrorModules = mkYarnModules {
+    inherit pname version;
+    packageJSON = ./package.json;
+    yarnLock = ./yarn.lock;
+    yarnNix = ./yarndeps.nix;
+  };
+
+  description = "Set of integrated tools for the R language";
+in
+(if server then stdenv.mkDerivation else mkDerivation)
+  (rec {
+    inherit pname version src RSTUDIO_VERSION_MAJOR RSTUDIO_VERSION_MINOR RSTUDIO_VERSION_PATCH RSTUDIO_VERSION_SUFFIX;
+
+    nativeBuildInputs = [
+      cmake
+      unzip
+      ant
+      jdk
+      makeWrapper
+      pandoc
+      nodejs
+    ] ++ lib.optionals (!server) [
+      copyDesktopItems
+    ];
+
+    buildInputs = [
+      boost
+      zlib
+      openssl
+      R
+      libuuid
+      yaml-cpp
+      soci
+      postgresql
+    ] ++ (if server then [
+      sqlite.dev
+      pam
+    ] else [
+      qtbase
+      qtxmlpatterns
+      qtsensors
+      qtwebengine
+      qtwebchannel
+    ]);
+
+    cmakeFlags = [
+      "-DRSTUDIO_TARGET=${if server then "Server" else "Desktop"}"
+      "-DCMAKE_BUILD_TYPE=Release"
+      "-DRSTUDIO_USE_SYSTEM_SOCI=ON"
+      "-DRSTUDIO_USE_SYSTEM_BOOST=ON"
+      "-DRSTUDIO_USE_SYSTEM_YAML_CPP=ON"
+      "-DQUARTO_ENABLED=FALSE"
+      "-DPANDOC_VERSION=${pandoc.version}"
+      "-DCMAKE_INSTALL_PREFIX=${placeholder "out"}/lib/rstudio"
+    ] ++ lib.optionals (!server) [
+      "-DQT_QMAKE_EXECUTABLE=${qmake}/bin/qmake"
+    ];
+
+    # Hack RStudio to only use the input R and provided libclang.
+    patches = [
+      ./r-location.patch
+      ./clang-location.patch
+      ./use-system-node.patch
+      ./fix-resources-path.patch
+      ./pandoc-nix-path.patch
+      ./remove-quarto-from-generator.patch
+      ./do-not-install-pandoc.patch
+    ];
+
+    postPatch = ''
+      substituteInPlace src/cpp/core/r_util/REnvironmentPosix.cpp --replace '@R@' ${R}
+
+      substituteInPlace src/cpp/CMakeLists.txt \
+        --replace 'SOCI_LIBRARY_DIR "/usr/lib"' 'SOCI_LIBRARY_DIR "${soci}/lib"'
+
+      substituteInPlace src/gwt/build.xml \
+        --replace '@node@' ${nodejs}
+
+      substituteInPlace src/cpp/core/libclang/LibClang.cpp \
+        --replace '@libclang@' ${llvmPackages.libclang.lib} \
+        --replace '@libclang.so@' ${llvmPackages.libclang.lib}/lib/libclang.so
+
+      substituteInPlace src/cpp/session/include/session/SessionConstants.hpp \
+        --replace '@pandoc@' ${pandoc}/bin/pandoc
+    '';
+
+    hunspellDictionaries = with lib; filter isDerivation (unique (attrValues hunspellDicts));
+    # These dicts contain identically-named dict files, so we only keep the
+    # -large versions in case of clashes
+    largeDicts = with lib; filter (d: hasInfix "-large-wordlist" d.name) hunspellDictionaries;
+    otherDicts = with lib; filter
+      (d: !(hasAttr "dictFileName" d &&
+        elem d.dictFileName (map (d: d.dictFileName) largeDicts)))
+      hunspellDictionaries;
+    dictionaries = largeDicts ++ otherDicts;
+
+    preConfigure = ''
+      mkdir dependencies/dictionaries
+      for dict in ${builtins.concatStringsSep " " dictionaries}; do
+        for i in "$dict/share/hunspell/"*; do
+          ln -s $i dependencies/dictionaries/
+        done
+      done
+
+      unzip -q ${mathJaxSrc} -d dependencies/mathjax-27
+
+      mkdir -p dependencies/pandoc/${pandoc.version}
+      cp ${pandoc}/bin/pandoc dependencies/pandoc/${pandoc.version}/pandoc
+
+      cp -r ${rsconnectSrc} dependencies/rsconnect
+      ( cd dependencies && ${R}/bin/R CMD build -d --no-build-vignettes rsconnect )
+
+      cp -r "${panmirrorModules}" src/gwt/panmirror/src/editor/node_modules
+    '';
+
+    postInstall = ''
+      mkdir -p $out/bin $out/share
+
+      ${lib.optionalString (!server) ''
+        mkdir -p $out/share/icons/hicolor/48x48/apps
+        ln $out/lib/rstudio/rstudio.png $out/share/icons/hicolor/48x48/apps
+      ''}
+
+      for f in {${if server
+        then "crash-handler-proxy,postback,r-ldpath,rpostback,rserver,rserver-pam,rsession,rstudio-server"
+        else "diagnostics,rpostback,rstudio"}}; do
+        ln -s $out/lib/rstudio/bin/$f $out/bin
+      done
+
+      for f in .gitignore .Rbuildignore LICENSE README; do
+        find . -name $f -delete
+      done
+
+      rm -r $out/lib/rstudio/{INSTALL,COPYING,NOTICE,README.md,SOURCE,VERSION}
+    '';
+
+    meta = with lib; {
+      broken = (stdenv.isLinux && stdenv.isAarch64);
+      inherit description;
+      homepage = "https://www.rstudio.com/";
+      license = licenses.agpl3Only;
+      maintainers = with maintainers; [ ciil cfhammill ];
+      mainProgram = "rstudio" + lib.optionalString server "-server";
+      platforms = platforms.linux;
+    };
+
+    passthru = {
+      inherit server;
+      tests = { inherit (nixosTests) rstudio-server; };
+    };
+  } // lib.optionalAttrs (!server) {
+    qtWrapperArgs = [
+      "--suffix PATH : ${lib.makeBinPath [ gnumake ]}"
+    ];
+
+    desktopItems = [
+      (makeDesktopItem {
+        name = pname;
+        exec = "rstudio %F";
+        icon = "rstudio";
+        desktopName = "RStudio";
+        genericName = "IDE";
+        comment = description;
+        categories = [ "Development" ];
+        mimeTypes = [
+          "text/x-r-source" "text/x-r" "text/x-R" "text/x-r-doc" "text/x-r-sweave" "text/x-r-markdown"
+          "text/x-r-html" "text/x-r-presentation" "application/x-r-data" "application/x-r-project"
+          "text/x-r-history" "text/x-r-profile" "text/x-tex" "text/x-markdown" "text/html"
+          "text/css" "text/javascript" "text/x-chdr" "text/x-csrc" "text/x-c++hdr" "text/x-c++src"
+        ];
+      })
+    ];
+  })