Merge pull request #25390 from Hodapp87/rstudio_fix
rstudio: Fix recompilation issue with custom package set
This commit is contained in:
commit
287e670462
@ -1,13 +1,5 @@
|
|||||||
{ stdenv, fetchurl, makeDesktopItem, cmake, boost163, zlib, openssl,
|
{ stdenv, fetchurl, makeDesktopItem, cmake, boost163, zlib, openssl,
|
||||||
R, qt5, libuuid, hunspellDicts, unzip, ant, jdk, gnumake, makeWrapper, pandoc,
|
R, qt5, libuuid, hunspellDicts, unzip, ant, jdk, gnumake, makeWrapper, pandoc
|
||||||
# If you have set up an R wrapper with other packages by following
|
|
||||||
# something like https://nixos.org/nixpkgs/manual/#r-packages, RStudio
|
|
||||||
# by default not be able to access any of those R packages. In order
|
|
||||||
# to do this, override the argument "R" here with your respective R
|
|
||||||
# wrapper, and set "useRPackages" to true. This will add the
|
|
||||||
# environment variable R_PROFILE_USER to the RStudio wrapper, pointing
|
|
||||||
# to an R script which will allow R to use these packages.
|
|
||||||
useRPackages ? false
|
|
||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
@ -111,14 +103,8 @@ stdenv.mkDerivation rec {
|
|||||||
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;";
|
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;";
|
||||||
};
|
};
|
||||||
|
|
||||||
postInstall = let rProfile =
|
postInstall = ''
|
||||||
# RStudio seems to bypass the environment variables that the R
|
wrapProgram $out/bin/rstudio --suffix PATH : ${gnumake}/bin
|
||||||
# wrapper already applies, and so this sets R_PROFILE_USER to
|
|
||||||
# again make those R packages accessible:
|
|
||||||
if useRPackages
|
|
||||||
then "--set R_PROFILE_USER ${R}/${R.passthru.fixLibsR}" else "";
|
|
||||||
in ''
|
|
||||||
wrapProgram $out/bin/rstudio --suffix PATH : ${gnumake}/bin ${rProfile}
|
|
||||||
mkdir $out/share
|
mkdir $out/share
|
||||||
cp -r ${desktopItem}/share/applications $out/share
|
cp -r ${desktopItem}/share/applications $out/share
|
||||||
mkdir $out/share/icons
|
mkdir $out/share/icons
|
||||||
|
@ -55,28 +55,23 @@ available.
|
|||||||
|
|
||||||
## RStudio
|
## RStudio
|
||||||
|
|
||||||
RStudio by default will not use the libraries installed like above.
|
RStudio uses a standard set of packages and ignores any custom R
|
||||||
You must override its R version with your custom R environment, and
|
environments or installed packages you may have. To create a custom
|
||||||
set `useRPackages` to `true`, like below:
|
environment, see `rstudioWrapper`, which functions similarly to
|
||||||
|
`rWrapper`:
|
||||||
|
|
||||||
```nix
|
```nix
|
||||||
{
|
{
|
||||||
packageOverrides = super: let self = super.pkgs; in
|
packageOverrides = super: let self = super.pkgs; in
|
||||||
{
|
{
|
||||||
|
|
||||||
rEnv = super.rWrapper.override {
|
rstudioEnv = super.rstudioWrapper.override {
|
||||||
packages = with self.rPackages; [
|
packages = with self.rPackages; [
|
||||||
devtools
|
dplyr
|
||||||
ggplot2
|
ggplot2
|
||||||
reshape2
|
reshape2
|
||||||
yaml
|
|
||||||
optparse
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
rstudioEnv = super.rstudio.override {
|
|
||||||
R = rEnv;
|
|
||||||
useRPackages = true;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
33
pkgs/development/r-modules/wrapper-rstudio.nix
Normal file
33
pkgs/development/r-modules/wrapper-rstudio.nix
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
{ stdenv, R, rstudio, makeWrapper, recommendedPackages, packages }:
|
||||||
|
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
|
||||||
|
name = rstudio.name + "-wrapper";
|
||||||
|
|
||||||
|
buildInputs = [makeWrapper R rstudio] ++ recommendedPackages ++ packages;
|
||||||
|
|
||||||
|
unpackPhase = ":";
|
||||||
|
|
||||||
|
# rWrapper points R to a specific set of packages by using a wrapper
|
||||||
|
# (as in https://nixos.org/nixpkgs/manual/#r-packages) which sets
|
||||||
|
# R_LIBS_SITE. Ordinarily, it would be possible to make RStudio use
|
||||||
|
# this same set of packages by simply overriding its version of R
|
||||||
|
# with the wrapped one, however, RStudio internally overrides
|
||||||
|
# R_LIBS_SITE. The below works around this by turning R_LIBS_SITE
|
||||||
|
# into an R file (fixLibsR) which achieves the same effect, then
|
||||||
|
# uses R_PROFILE_USER to load this code at startup in RStudio.
|
||||||
|
fixLibsR = "fix_libs.R";
|
||||||
|
installPhase = ''
|
||||||
|
mkdir $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}
|
||||||
|
makeWrapper ${rstudio}/bin/rstudio $out/bin/rstudio --set R_PROFILE_USER $out/${fixLibsR}
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
platforms = stdenv.lib.platforms.unix;
|
||||||
|
};
|
||||||
|
}
|
@ -1,19 +1,12 @@
|
|||||||
{ stdenv, R, makeWrapper, recommendedPackages, packages }:
|
{ stdenv, R, makeWrapper, recommendedPackages, packages }:
|
||||||
|
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation {
|
||||||
name = R.name + "-wrapper";
|
name = R.name + "-wrapper";
|
||||||
|
|
||||||
buildInputs = [makeWrapper R] ++ recommendedPackages ++ packages;
|
buildInputs = [makeWrapper R] ++ recommendedPackages ++ packages;
|
||||||
|
|
||||||
unpackPhase = ":";
|
unpackPhase = ":";
|
||||||
|
|
||||||
# This filename is used in 'installPhase', but needs to be
|
|
||||||
# referenced elsewhere. This will be relative to this package's
|
|
||||||
# path.
|
|
||||||
passthru = {
|
|
||||||
fixLibsR = "fix_libs.R";
|
|
||||||
};
|
|
||||||
|
|
||||||
installPhase = ''
|
installPhase = ''
|
||||||
mkdir -p $out/bin
|
mkdir -p $out/bin
|
||||||
cd ${R}/bin
|
cd ${R}/bin
|
||||||
@ -21,17 +14,6 @@ stdenv.mkDerivation rec {
|
|||||||
makeWrapper ${R}/bin/$exe $out/bin/$exe \
|
makeWrapper ${R}/bin/$exe $out/bin/$exe \
|
||||||
--prefix "R_LIBS_SITE" ":" "$R_LIBS_SITE"
|
--prefix "R_LIBS_SITE" ":" "$R_LIBS_SITE"
|
||||||
done
|
done
|
||||||
# RStudio (and perhaps other packages) overrides the R_LIBS_SITE
|
|
||||||
# which the wrapper above applies, and as a result packages
|
|
||||||
# installed in the wrapper (as in the method described in
|
|
||||||
# https://nixos.org/nixpkgs/manual/#r-packages) aren't visible.
|
|
||||||
# The below turns R_LIBS_SITE into some R startup code which can
|
|
||||||
# correct this.
|
|
||||||
echo "# Autogenerated by wrapper.nix from R_LIBS_SITE" > $out/${passthru.fixLibsR}
|
|
||||||
echo -n ".libPaths(c(.libPaths(), \"" >> $out/${passthru.fixLibsR}
|
|
||||||
echo -n $R_LIBS_SITE | sed -e 's/:/", "/g' >> $out/${passthru.fixLibsR}
|
|
||||||
echo -n "\"))" >> $out/${passthru.fixLibsR}
|
|
||||||
echo >> $out/${passthru.fixLibsR}
|
|
||||||
'';
|
'';
|
||||||
|
|
||||||
meta = {
|
meta = {
|
||||||
|
@ -10610,6 +10610,15 @@ with pkgs;
|
|||||||
packages = [];
|
packages = [];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
rstudioWrapper = callPackage ../development/r-modules/wrapper-rstudio.nix {
|
||||||
|
recommendedPackages = with rPackages; [
|
||||||
|
boot class cluster codetools foreign KernSmooth lattice MASS
|
||||||
|
Matrix mgcv nlme nnet rpart spatial survival
|
||||||
|
];
|
||||||
|
# Override this attribute to register additional libraries.
|
||||||
|
packages = [];
|
||||||
|
};
|
||||||
|
|
||||||
rPackages = callPackage ../development/r-modules {
|
rPackages = callPackage ../development/r-modules {
|
||||||
overrides = (config.rPackageOverrides or (p: {})) pkgs;
|
overrides = (config.rPackageOverrides or (p: {})) pkgs;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user