diff --git a/pkgs/applications/editors/rstudio/default.nix b/pkgs/applications/editors/rstudio/default.nix index 62c3a93f76b4..d703198fa775 100644 --- a/pkgs/applications/editors/rstudio/default.nix +++ b/pkgs/applications/editors/rstudio/default.nix @@ -1,4 +1,5 @@ { lib +, stdenv , mkDerivation , fetchurl , fetchpatch @@ -30,6 +31,9 @@ , nodejs , mkYarnModules , qmake +, server ? false # build server version +, sqlite +, pam }: let @@ -61,149 +65,165 @@ let panmirrorModules = mkYarnModules { inherit pname version; packageJSON = ./package.json; - yarnLock = ./yarn.lock; + yarnLock = ./yarn.lock; yarnNix = ./yarndeps.nix; }; + description = "Set of integrated tools for the R language"; in -mkDerivation rec { - inherit pname version src RSTUDIO_VERSION_MAJOR RSTUDIO_VERSION_MINOR RSTUDIO_VERSION_PATCH; +(if server then stdenv.mkDerivation else mkDerivation) + (rec { + inherit pname version src RSTUDIO_VERSION_MAJOR RSTUDIO_VERSION_MINOR RSTUDIO_VERSION_PATCH; - nativeBuildInputs = [ - cmake - unzip - ant - jdk - makeWrapper - pandoc - nodejs - copyDesktopItems - ]; + nativeBuildInputs = [ + cmake + unzip + ant + jdk + makeWrapper + pandoc + nodejs + ] ++ lib.optional (!server) [ + copyDesktopItems + ]; - buildInputs = [ - boost - zlib - openssl - R - qtbase - qtxmlpatterns - qtsensors - qtwebengine - qtwebchannel - libuuid - libyamlcpp - soci - postgresql - ]; + buildInputs = [ + boost + zlib + openssl + R + libuuid + libyamlcpp + soci + postgresql + ] ++ (if server then [ + sqlite.dev + pam + ] else [ + qtbase + qtxmlpatterns + qtsensors + qtwebengine + qtwebchannel + ]); - cmakeFlags = [ - "-DRSTUDIO_TARGET=Desktop" - "-DCMAKE_BUILD_TYPE=Release" - "-DQT_QMAKE_EXECUTABLE=${qmake}/bin/qmake" - "-DRSTUDIO_USE_SYSTEM_SOCI=ON" - "-DRSTUDIO_USE_SYSTEM_BOOST=ON" - "-DRSTUDIO_USE_SYSTEM_YAML_CPP=ON" - "-DPANDOC_VERSION=${pandoc.version}" - "-DCMAKE_INSTALL_PREFIX=${placeholder "out"}/lib/rstudio" - ]; + 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" + "-DPANDOC_VERSION=${pandoc.version}" + "-DCMAKE_INSTALL_PREFIX=${placeholder "out"}/lib/rstudio" + ] ++ lib.optional (!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 - # postFetch doesn't work with this | error: unexpected end-of-file - # replacing /usr/bin/node is done in postPatch - # https://src.fedoraproject.org/rpms/rstudio/tree/rawhide - (fetchpatch { - name = "system-node.patch"; - url = "https://src.fedoraproject.org/rpms/rstudio/raw/5bda2e290c9e72305582f2011040938d3e356906/f/0004-use-system-node.patch"; - sha256 = "sha256-P1Y07RB/ceFNa749nyBUWSE41eiiZgt43zVcmahvfZM="; - }) - ]; + # Hack RStudio to only use the input R and provided libclang. + patches = [ + ./r-location.patch + ./clang-location.patch + # postFetch doesn't work with this | error: unexpected end-of-file + # replacing /usr/bin/node is done in postPatch + # https://src.fedoraproject.org/rpms/rstudio/tree/rawhide + (fetchpatch { + name = "system-node.patch"; + url = "https://src.fedoraproject.org/rpms/rstudio/raw/5bda2e290c9e72305582f2011040938d3e356906/f/0004-use-system-node.patch"; + sha256 = "sha256-P1Y07RB/ceFNa749nyBUWSE41eiiZgt43zVcmahvfZM="; + }) + ]; - postPatch = '' - substituteInPlace src/cpp/core/r_util/REnvironmentPosix.cpp --replace '@R@' ${R} + 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/cpp/CMakeLists.txt \ + --replace 'SOCI_LIBRARY_DIR "/usr/lib"' 'SOCI_LIBRARY_DIR "${soci}/lib"' - substituteInPlace src/gwt/build.xml \ - --replace '/usr/bin/node' '${nodejs}/bin/node' + substituteInPlace src/gwt/build.xml \ + --replace '/usr/bin/node' '${nodejs}/bin/node' - substituteInPlace src/cpp/core/libclang/LibClang.cpp \ - --replace '@libclang@' ${llvmPackages.libclang.lib} \ - --replace '@libclang.so@' ${llvmPackages.libclang.lib}/lib/libclang.so + 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 "bin/pandoc" "${pandoc}/bin/pandoc" - ''; + substituteInPlace src/cpp/session/include/session/SessionConstants.hpp \ + --replace "bin/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) hunspellDictionaries; - otherDicts = with lib; filter - (d: !(hasAttr "dictFileName" d && - elem d.dictFileName (map (d: d.dictFileName) largeDicts))) - hunspellDictionaries; - dictionaries = largeDicts ++ otherDicts; + 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) 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/ + 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 - done - unzip -q ${mathJaxSrc} -d dependencies/mathjax-27 + unzip -q ${mathJaxSrc} -d dependencies/mathjax-27 - mkdir -p dependencies/pandoc/${pandoc.version} - cp ${pandoc}/bin/pandoc dependencies/pandoc/${pandoc.version}/pandoc + 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 ${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 - ''; + cp -r "${panmirrorModules}" src/gwt/panmirror/src/editor/node_modules + ''; - postInstall = '' - mkdir -p $out/share/icons/hicolor/48x48/apps $out/bin - ln $out/lib/rstudio/rstudio.png $out/share/icons/hicolor/48x48/apps + postInstall = '' + mkdir -p $out/bin $out/share - for f in {diagnostics,rpostback,rstudio}; do - ln -s $out/lib/rstudio/bin/$f $out/bin - done + ${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 .gitignore .Rbuildignore LICENSE README; do - find . -name $f -delete - done - rm -r $out/lib/rstudio/{INSTALL,COPYING,NOTICE,README.md,SOURCE,VERSION} - rm -r $out/lib/rstudio/bin/{pandoc/pandoc,pandoc} - ''; + 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 - qtWrapperArgs = [ - "--suffix PATH : ${lib.makeBinPath [ gnumake ]}" - ]; + 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} + rm -r $out/lib/rstudio/bin/{pandoc/pandoc,pandoc} + ''; - desktopItems = [ - (makeDesktopItem { - name = "${pname}"; - exec = "rstudio %F"; - icon = "rstudio"; - desktopName = "RStudio"; - genericName = "IDE"; - comment = meta.description; - categories = "Development;"; - mimeType = "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;"; - }) - ]; + meta = with lib; { + inherit description; + homepage = "https://www.rstudio.com/"; + license = licenses.agpl3Only; + maintainers = with maintainers; [ ciil cfhammill ]; + platforms = platforms.linux; + }; - meta = with lib; { - description = "Set of integrated tools for the R language"; - homepage = "https://www.rstudio.com/"; - license = licenses.agpl3Only; - maintainers = with maintainers; [ ciil ]; - platforms = platforms.linux; - }; -} + passthru = { inherit 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;"; + mimeType = "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;"; + }) + ]; + }) diff --git a/pkgs/development/r-modules/wrapper-rstudio.nix b/pkgs/development/r-modules/wrapper-rstudio.nix index 5eeac8fed30e..b20b61d6c58d 100644 --- a/pkgs/development/r-modules/wrapper-rstudio.nix +++ b/pkgs/development/r-modules/wrapper-rstudio.nix @@ -1,16 +1,23 @@ -{ lib, runCommand, R, rstudio, wrapQtAppsHook, recommendedPackages, packages, qtbase }: +{ lib +, runCommand +, R +, rstudio +, makeWrapper +, wrapQtAppsHook +, recommendedPackages +, packages +, fontconfig +}: -let - qtVersion = with lib.versions; "${major qtbase.version}.${minor qtbase.version}"; -in -runCommand (rstudio.name + "-wrapper") { +runCommand (rstudio.name + "-wrapper") +{ preferLocalBuild = true; allowSubstitutes = false; - nativeBuildInputs = [wrapQtAppsHook]; + nativeBuildInputs = [ (if rstudio.server then makeWrapper else wrapQtAppsHook) ]; dontWrapQtApps = true; - buildInputs = [R rstudio] ++ recommendedPackages ++ packages; + buildInputs = [ R rstudio ] ++ recommendedPackages ++ packages; # rWrapper points R to a specific set of packages by using a wrapper # (as in https://nixos.org/nixpkgs/manual/#r-packages) which sets @@ -22,14 +29,27 @@ runCommand (rstudio.name + "-wrapper") { # uses R_PROFILE_USER to load this code at startup in RStudio. fixLibsR = "fix_libs.R"; } -'' -mkdir $out -ln -s ${rstudio}/share $out -echo "# Autogenerated by wrapper-rstudio.nix from R_LIBS_SITE" > $out/$fixLibsR -echo -n ".libPaths(c(.libPaths(), \"" >> $out/$fixLibsR -echo -n $R_LIBS_SITE | sed -e 's/:/", "/g' >> $out/$fixLibsR -echo -n "\"))" >> $out/$fixLibsR -echo >> $out/$fixLibsR -makeQtWrapper ${rstudio}/bin/rstudio $out/bin/rstudio \ - --set R_PROFILE_USER $out/$fixLibsR -'' + ( + '' + mkdir -p $out/bin + ln -s ${rstudio}/share $out + echo "# Autogenerated by wrapper-rstudio.nix from R_LIBS_SITE" > $out/$fixLibsR + echo -n ".libPaths(c(.libPaths(), \"" >> $out/$fixLibsR + echo -n $R_LIBS_SITE | sed -e 's/:/", "/g' >> $out/$fixLibsR + echo -n "\"))" >> $out/$fixLibsR + echo >> $out/$fixLibsR + '' + + (if + rstudio.server then '' + makeWrapper ${rstudio}/bin/rsession $out/bin/rsession \ + --set R_PROFILE_USER $out/$fixLibsR --set FONTCONFIG_FILE ${fontconfig.out}/etc/fonts/fonts.conf + + makeWrapper ${rstudio}/bin/rserver $out/bin/rserver \ + --add-flags --rsession-path=$out/bin/rsession + '' + else + '' + makeQtWrapper ${rstudio}/bin/rstudio $out/bin/rstudio \ + --set R_PROFILE_USER $out/$fixLibsR + '') + ) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index e3bf4e41ed0a..0430afcc41ae 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -20754,6 +20754,8 @@ with pkgs; packages = []; }; + rstudioServerWrapper = rstudioWrapper.override { rstudio = rstudio-server; }; + rPackages = dontRecurseIntoAttrs (callPackage ../development/r-modules { overrides = (config.rPackageOverrides or (_: {})) pkgs; }); @@ -28382,6 +28384,8 @@ with pkgs; jdk = jdk8; }; + rstudio-server = rstudio.override { server = true; }; + rsync = callPackage ../applications/networking/sync/rsync (config.rsync or {}); rrsync = callPackage ../applications/networking/sync/rsync/rrsync.nix {};